HashMap - पहली कुंजी मूल्य प्राप्त करना


129

नीचे हाशप में मान सम्‍मिलित हैं

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

पहली कुंजी प्राप्त करने के लिए जावा कोड (यानी सक्रिय)

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

हम पहली कुंजी "मान" (33) को कैसे इकट्ठा कर सकते हैं, मैं "कुंजी" और "मान" दोनों को अलग-अलग चर में संग्रहीत करना चाहता हूं।


9
आपको पता चलता है कि HashMapप्रविष्टियाँ अनियंत्रित हैं, और इसलिए जब भी आप नक्शे को संशोधित करते हैं तो "पहले" बदल सकता है?
एनपीई

1
क्या आप समझते हैं कि इसमें कोई विशेष क्रम नहीं है HashMap? यदि आप इसे बिल्कुल संशोधित करते हैं, तो आपको परिणाम पूरी तरह से अलग क्रम में मिल सकते हैं।
जॉन स्कीट

नहीं, ऑर्डर को रन से चलाने की गारंटी नहीं है, लेकिन एक ही धागे के भीतर ऑर्डर पर भरोसा किया जा सकता है।
एचडी

1
@JonSkeet वास्तव में यह वास्तव में मान्य प्रश्न है। ग्रूवी में बहुत सारे मामले हैं जहां आपको एक संरचना मिलती है जो नक्शे की एक सूची की तरह दिखती है, प्रत्येक नक्शे में एक प्रविष्टि होती है। अभी तक मुझे सभी मूल्यों का पता लगाने के लिए एक आसान / स्पष्ट (ग्रूवी) तरीका नहीं मिला है। यदि कुंजियाँ स्थिर रहती हैं, तो यह प्रत्येक संग्रह को प्रिंट करने के लिए collection.each {println it.key} के रूप में आसान है, लेकिन निरंतर कुंजियों के बिना यह स्पष्ट नहीं है, लेकिन संग्रह {each {println it.values ​​() [0]} काम करता है ( कुछ उत्तरों का शोधन यहाँ ...)।
बिल के

@BillK: यदि आप जानते हैं कि प्रत्येक नक्शे में वास्तव में एक प्रविष्टि है, तो यह वास्तव में एक अलग सवाल है, और एक जो अधिक समझ में आता है।
जॉन स्कीट

जवाबों:


251

आप यह कोशिश कर सकते हैं:

 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आदेश को अक्षुण्ण रखने के लिए a का उपयोग करें ।

उदाहरण के लिए:

 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सही जगह के बजाय कहा ... ऑनलाइन उत्तर नहीं पा रहा है..हेल्प
ब्लू बॉट

@darthydarth आपको अपने संदर्भ के आधार पर उचित प्रकार का उपयोग करना चाहिए।
रुचिरा गायन रणवीरा

जवाब देने के लिए पहला सुपर धन्यवाद! यह उम्मीद नहीं कर रहा था ... दूसरा मैं करता हूं, यह पाया कि जेनरिक के साथ एक मुद्दा है जो रनटाइम में नहीं बचा है। अंततः मैंने Gsonमूल्य ऑब्जेक्ट को कन्वर्ट करने के लिए उपयोग करके इसके चारों ओर हैक किया Stringऔर फिर इसे अपने वर्ग प्रकार पर वापस भेज दिया। इसका बदसूरत लेकिन मुझे वास्तव में किसी भी अन्य चीज़ का कोई समाधान नहीं मिला जो कि अन्य भाषाओं में करना इतना आसान है (मुझे अब जावा की तलाश है)
ब्लू बॉट

यकीन है लेकिन कैसे? टिप्पणी अनुभाग के लिए इसकी बहुत अधिक
ब्लू बॉट

@darthydarth आप मुझे एक ईमेल भेज सकते हैं। ruchiragayan@gmail.com
रुचिरा गायन

65

"प्रथम" मान प्राप्त करने के लिए:

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

"प्रथम" कुंजी का मान प्राप्त करने के लिए:

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

नोट: उपरोक्त कोड परीक्षण और कार्य करता है।

मैं कहता हूं "पहले" क्योंकि हाशपाप प्रविष्टियों का आदेश नहीं दिया गया है।

हालाँकि, एक LinkedHashMap अपनी प्रविष्टियों को उसी क्रम में पुनरावृत्त करता है जैसे वे डाले गए थे - यदि आप सम्मिलन क्रम महत्वपूर्ण है तो आप अपने मानचित्र कार्यान्वयन के लिए इसका उपयोग कर सकते हैं।


आपको पहले यह जांचना होगा कि नक्शा खाली नहीं है
ACV

48

जावा 8 करने का तरीका,

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


यदि हमारे पास कुंजी है, तो map.get (firstKey) का उपयोग करके पहला मान पुनः प्राप्त करें। बस एक संकेत है। :)
उपविजेता

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

हम पहली कुंजी "मूल्य" (यानी 33) कैसे जमा कर सकते हैं

का उपयोग करके youMap.get(keyYouHave), आप इसके मूल्य प्राप्त कर सकते हैं।

दोनों "कुंजी" और "मान" को अलग-अलग चर में संग्रहीत करना चाहते हैं

हां, आप इसे एक चर में निर्दिष्ट कर सकते हैं।

रुको ......... यह खत्म नहीं हुआ है।

यदि आप (व्यावसायिक तर्क) सम्मिलन और पुनर्प्राप्ति के आदेश पर निर्भर हैं, तो आप अजीब परिणाम देखने जा रहे हैं। मानचित्र का आदेश नहीं दिया गया है वे एक आदेश में संग्रहीत नहीं करेंगे। कृपया उस तथ्य से अवगत रहें। अपने आदेश को संरक्षित करने के लिए कुछ विकल्प का उपयोग करें। शायद एLinkedHashMap


2

ध्यान दें कि आपको ध्यान देना चाहिए कि आपके तर्क प्रवाह को कभी भी HashMapकिसी क्रम में तत्वों तक पहुँचने पर भरोसा नहीं करना चाहिए , बस इसलिए क्योंकि HashMapएस को आदेश नहीं दिया Collectionजाता है और यह वह नहीं है जो वे करने का लक्ष्य रखते हैं। (आप इस पोस्ट में odered और सॉर्टर संग्रह के बारे में अधिक पढ़ सकते हैं )।

पोस्ट पर वापस, आपने पहले तत्व कुंजी को लोड करके पहले से ही आधा काम किया था:

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"));

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.