হ্যাশম্যাপ - প্রথম কী মান পাচ্ছে


128

নীচে হ্যাশম্যাপে থাকা মানগুলি রয়েছে

statusName {Active=33, Renewals Completed=3, Application=15}

প্রথম কী (যেমন সক্রিয়) পাওয়ার জাভা কোড

Object myKey = statusName.keySet().toArray()[0];

আমরা কীভাবে প্রথম কী "মান" সংগ্রহ করতে পারি (অর্থাত্ 33), আমি পৃথক ভেরিয়েবলে "কী" এবং "মান" উভয়ই সঞ্চয় করতে চাই।


9
আপনি বুঝতে পারছেন যে HashMapএন্ট্রিগুলি অর্ডারড করা হয়নি, এবং আপনি যখনই মানচিত্রটি পরিবর্তন করবেন তখন "প্রথম" পরিবর্তন হতে পারে?
এনপিই

1
আপনি কি বুঝতে পেরেছেন যে একটিতে কোনও নির্দিষ্ট আদেশ নেই HashMap? আপনি যদি এটি একেবারে সংশোধন করেন তবে আপনি ফলাফলটি সম্পূর্ণ আলাদা অর্ডারে পেতে পারেন।
জন স্কিটি

না, রান চালানোর জন্য আদেশের নিশ্চয়তা নেই, তবে একই থ্রেডের মধ্যে ক্রম উপর নির্ভর করা যেতে পারে।
এইচডি 1

1
@ জোনস্কিট আসলে এটি সত্যই বৈধ প্রশ্ন। গ্রোভিতে এমন অনেকগুলি কেস রয়েছে যেখানে আপনি কোনও কাঠামো ফিরে পান যা মানচিত্রের তালিকার মতো লাগে, প্রতিটি মানচিত্র একটি একক প্রবেশ সহ entry এখন পর্যন্ত আমি সমস্ত মান মুদ্রণের কোনও সহজ / সুস্পষ্ট (গ্রোভি) উপায় খুঁজে পাইনি। কীগুলি যদি ধ্রুব থাকে, তবে সংগ্রহের মতোই সহজ each প্রতিটি মান মুদ্রণ করতে {মুদ্রণ এটি.কি} করুন, তবে ধ্রুবক কীগুলি ছাড়া এটি সুস্পষ্ট নয়, তবে সংগ্রহ.ইচ {প্রিন্টলন ইট। মূল্যগুলি () [0]} কাজ করে ( এখানে কয়েকটি উত্তরের পরিমার্জন ...)।
বিল কে

@ বিলক: আপনি যদি জানেন যে প্রতিটি মানচিত্রে হুবহু একটি প্রবেশ রয়েছে, তবে এটি সত্যিই আলাদা প্রশ্ন এবং এটি আরও বোঝা।
জন স্কিটি

উত্তর:


249

আপনি এটি চেষ্টা করতে পারেন:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

মনে রাখবেন, HashMapসন্নিবেশ আদেশের গ্যারান্টি দেয় না। LinkedHashMapঅর্ডার অক্ষত রাখতে একটি ব্যবহার করুন ।

উদাহরণ:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

আউটপুট:

 Active
 33

আমি জানি এটি একটি পুরানো উত্তর .. এটি কী এবং মান সহ স্ট্রিং হিসাবে হ্যাশম্যাপের জন্য কাজ করছে। কাস্টিং ত্রুটি পাওয়ার জন্য যদি বস্তুর সাথে একই চেষ্টা করা হয়: com.google.gson.internal.LinkedTreeMap cannot be cast to...... আমার ক্লাস যা আমি Stringসঠিক জায়গায় পরিবর্তে বলেছি ... অনলাইনে উত্তর খুঁজে পাবে না ... সহায়তা
ব্লু বট

@ সার্থকথারথ আপনার প্রসঙ্গের ভিত্তিতে আপনার যথাযথ প্রকারটি ব্যবহার করা উচিত।
রুচিরা গায়ান রানাভিরা

উত্তর দেওয়ার জন্য প্রথম সুপার ধন্যবাদ! এটির প্রত্যাশা করা ছিল না ... দ্বিতীয়টি আমি করলাম, জেনেরিক্সের একটি সমস্যা আছে যা রানটাইমে সংরক্ষণ করা হয়নি। অবশেষে আমি এর আশেপাশে হ্যাক করে Gsonভ্যালু অবজেক্টকে একটিতে রূপান্তরিত করে Stringতারপরে এটি আমার শ্রেণির ধরণে পার্স করে। এটি কুরুচিপূর্ণ তবে আমি সত্যিই অন্য কোনও ভাষায় এমন সহজ করার মতো অন্য কোনও সমাধান খুঁজে পাইনি (আমি এখন জাভা ছেড়ে চলেছি)
ব্লু বট

নিশ্চিত তবে কীভাবে? এটি মন্তব্য বিভাগের জন্য খুব বেশি
ব্লু বট

@ সার্থকথারথ আপনি আমাকে ইমেল পাঠাতে পারেন ruchiragayan@gmail.com
রুচিরা গায়ান

65

"প্রথম" মান পেতে:

map.values().toArray()[0]

"প্রথম" কীটির মান পেতে:

map.get(map.keySet().toArray()[0])

দ্রষ্টব্য: উপরে কোড পরীক্ষিত এবং কাজ করে।

আমি "প্রথম" বলি কারণ হ্যাশম্যাপ এন্ট্রি অর্ডার করা হয়নি।

তবে একটি লিঙ্কডহ্যাশম্যাপ তার প্রবেশদ্বারগুলি যেমন sertedোকানো হয়েছিল তেমনিভাবে তা পুনরুক্ত করে - সন্নিবেশনের আদেশটি গুরুত্বপূর্ণ হলে আপনি এটি আপনার মানচিত্র প্রয়োগের জন্য ব্যবহার করতে পারেন।


আপনাকে প্রথমে পরীক্ষা করতে হবে যে মানচিত্রটি খালি নয়
এসিভি

48

জাভা 8 করার উপায়,

String firstKey = map.keySet().stream().findFirst().get();


আমাদের যদি কী থাকে তবে ম্যাপ.জেট (ফার্স্টকি) ব্যবহার করে প্রথম মানটি পুনরুদ্ধার করুন। শুধু একটি ইঙ্গিত। :)
Upen

7

পুরো প্রথম প্রবেশের জন্য আপনি এটি ব্যবহার করে দেখতেও পারেন,

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

এটি প্রথম প্রবেশের একমাত্র চাবি পেতে,

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

এটি কেবল প্রথম প্রবেশের মান পেতে,

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

তদুপরি, আপনি কী করছেন তা আপনি যদি জানেন এবং কোনও মানচিত্রের দ্বিতীয় (তৃতীয় ইত্যাদির জন্য একই জিনিস) পেতে চান তবে আপনার এটি চেষ্টা করা উচিত,

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();

4

আমরা কী কীভাবে প্রথম কী "মান" সংগ্রহ করতে পারি (ie 33)

ব্যবহার করে youMap.get(keyYouHave), আপনি এর মান পেতে পারেন।

"কী" এবং "মান" উভয়ই পৃথক ভেরিয়েবলে সঞ্চয় করতে চান

হ্যাঁ, আপনি এটি একটি ভেরিয়েবলকে বরাদ্দ করতে পারেন।

অপেক্ষা করুন ......... শেষ হয়নি।

আপনি যদি (ব্যবসায়িক যুক্তি) সন্নিবেশ এবং পুনরুদ্ধারের ক্রমের উপর নির্ভর করে থাকেন তবে আপনি অদ্ভুত ফলাফল দেখতে যাচ্ছেন। মানচিত্রে অর্ডার দেওয়া হয়নি তারা কোনও অর্ডারে সঞ্চয় করবে না। দয়া করে সেই সত্যটি সম্পর্কে সচেতন হন। আপনার অর্ডার সংরক্ষণের জন্য কিছু বিকল্প ব্যবহার করুন। সম্ভবত কLinkedHashMap


2

মনে রাখবেন যে আপনার লজিক প্রবাহটি HashMapকোনও ক্রমে উপাদানগুলিতে অ্যাক্সেস করার জন্য কখনই নির্ভর করা উচিত নয় , কেবল কারণ এটি অর্ডার করা HashMapহয় না Collectionএবং এটি তাদের লক্ষ্য নয়। (আপনি এই পোস্টে ওডারড এবং সর্ট সংগ্রহ সম্পর্কে আরও পড়তে পারেন )।

পোস্টে ফিরে, আপনি ইতিমধ্যে প্রথম উপাদান কী লোড করে অর্ধেক কাজ করেছেন:

Object myKey = statusName.keySet().toArray()[0];

কেবলমাত্র map.get(key)সংশ্লিষ্ট মান পেতে কল করুন :

Object myValue = statusName.get(myKey);

1

মনে রাখবেন যে সারণি ক্রমটি সাধারণত বলা ম্যাপে সম্মানিত হয় না। এটা চেষ্টা কর :

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map){
        K value = null;
        if(map != null && map.size() > 0){
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        }
        return  value;
    }

আমি এটি তখনই ব্যবহার করি যখন আমি নিশ্চিত যে এটি map.size() == 1


1

হোয়ামির জবাব উন্নত করা। যেহেতু findFirst()একটি রিটার্ন Optionalদেয় তাই মান আছে কিনা তা পরীক্ষা করা ভাল অভ্যাস।

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

এছাড়াও, কেউ কেউ মন্তব্য করেছেন যে একটি এর প্রথম কীটি খুঁজে HashSetপাওয়া বিশ্বাসযোগ্য নয়। তবে মাঝে মাঝে আমাদের HashMapজুড়ি থাকে; অর্থাত্ প্রতিটি মানচিত্রে আমাদের একটি কী এবং একটি মান রয়েছে। এই জাতীয় ক্ষেত্রে দ্রুত এই জাতীয় জুটির প্রথম কীটি সন্ধান করা সুবিধাজনক।


0

এটি করার একটি দুর্দান্ত উপায় :)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.