java - एक जावा हैशप में एक कुंजी दी गई मान को कैसे अपडेट करें?




key hashmap (11)

मान लें कि हमारे पास जावा में HashMap<String, Integer> है।

मैं स्ट्रिंग-कुंजी के पूर्णांक-मान को स्ट्रिंग-कुंजी के प्रत्येक अस्तित्व के लिए कैसे अपडेट करूं (increment)?

कोई जोड़ी को हटा और फिर से घुमा सकता है, लेकिन उपरांत चिंता का विषय होगा।
एक और तरीका सिर्फ नई जोड़ी डालना होगा और पुराना एक बदल दिया जाएगा।

बाद के मामले में, क्या होता है यदि एक नई कुंजी के साथ हैशकोड टकराव है तो मैं सम्मिलित करने की कोशिश कर रहा हूं? हैशटेबल के लिए सही व्यवहार इसके लिए एक अलग जगह असाइन करना होगा, या वर्तमान बाल्टी में इसकी सूची बनाना होगा।


जावा 8 रास्ता:

आप computeIfPresent विधि का उपयोग कर सकते हैं और इसे एक मैपिंग फ़ंक्शन प्रदान कर सकते हैं, जिसे मौजूदा एक के आधार पर एक नया मान गणना करने के लिए बुलाया जाएगा।

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

Map<String, Integer> words = new HashMap<>();
words.put("hello", 3);
words.put("world", 4);
words.computeIfPresent("hello", (k, v) -> v + 1);
System.out.println(words.get("hello"));

वैकल्पिक रूप से, आप merge विधि का उपयोग कर सकते हैं, जहां 1 डिफ़ॉल्ट मान और फ़ंक्शन मौजूदा मान को 1 से बढ़ाता है:

words.merge("hello", 1, Integer::sum);

इसके अलावा, अन्य उपयोगी विधियों का एक गुच्छा है, जैसे putIfAbsent , getOrDefault , forEach , आदि।


@ मैथ्यू का समाधान सबसे सरल है और ज्यादातर मामलों में पर्याप्त प्रदर्शन करेगा।

यदि आपको उच्च प्रदर्शन की आवश्यकता है, तो AtomicInteger एक बेहतर समाधान है @ बाल्लूसी।

हालांकि, एक तेज़ समाधान (प्रदान की गई थ्रेड सुरक्षा कोई मुद्दा नहीं है) TObjectIntHashMap का उपयोग TObjectIntHashMap जो एक वृद्धि (कुंजी) विधि प्रदान करता है और परमाणु इंटीग्रेट बनाने से प्राइमेटिव और कम ऑब्जेक्ट्स का उपयोग करता है। जैसे

TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");

आप नीचे की तरह वृद्धि कर सकते हैं लेकिन आपको अस्तित्व की जांच करने की आवश्यकता है ताकि एक NullPointerException फेंक दिया न जाए

if(!map.containsKey(key)) {
 p.put(key,1);
}
else {
 p.put(key, map.getKey()+1);
}

एक लाइन समाधान:

map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);

चूंकि मैं कम प्रतिष्ठा के कारण कुछ उत्तरों पर टिप्पणी नहीं कर सकता, इसलिए मैं एक समाधान पोस्ट करूंगा जो मैंने लागू किया था।

for(String key : someArray)
{
   if(hashMap.containsKey(key)//will check if a particular key exist or not 
   {
      hashMap.put(hashMap.get(key),value+1);// increment the value by 1 to an already existing key
   }
   else
   {
      hashMap.put(key,value);// make a new entry into the hashmap
   }
}

प्रयत्न:

HashMap hm=new HashMap<String ,Double >();

ध्यान दें:

String->give the new value; //THIS IS THE KEY
else
Double->pass new value; //THIS IS THE VALUE

आप या तो अपने हैशैप में कुंजी या मान बदल सकते हैं, लेकिन आप एक ही समय में दोनों को बदल नहीं सकते हैं।


यहां इस प्रश्न के भ्रामक उत्तर हैं जो बताते हैं कि हैशटेबल पुट विधि मौजूदा मान को प्रतिस्थापित कर देगी यदि कुंजी मौजूद है, यह हैशटेबल के लिए सही नहीं है बल्कि हैश मैप के लिए है। हैश मैप के लिए जावाडोक देखें http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29


सरलीकृत जावा 8 रास्ता:

map.put(key, map.getOrDefault(key, 0) + 1);

यह हैश मैप की विधि का उपयोग करता है जो कुंजी के लिए मान पुनर्प्राप्त करता है, लेकिन यदि कुंजी को पुनर्प्राप्त नहीं किया जा सकता है तो यह निर्दिष्ट डिफ़ॉल्ट मान देता है (इस मामले में '0')।

यह कोर जावा के भीतर समर्थित है: हैश मैप <के, वी> getOrDefault (ऑब्जेक्ट कुंजी, वी डिफ़ॉल्ट वैल्यू)


AtomicInteger द्वारा Integer को बदलें और इसमें incrementAndGet में से एक को कॉल करें और getAndIncrement विधियों पर कॉल करें।

एक विकल्प है कि आप अपने स्वयं के MutableInteger क्लास में एक int को लपेटें जिसमें एक increment() विधि हो, तो आपके पास अभी तक हल करने के लिए केवल एक थ्रेडस्फीटी चिंता है।


Integer i = map.get(key);
if(i == null)
   i = (aValue)
map.put(key, i + 1);

या

Integer i = map.get(key);
map.put(key, i == null ? newValue : i + 1);

इंटीजर आदिम डेटा प्रकार http://cs.fit.edu/~ryan/java/language/java-data.html , इसलिए आपको इसे बाहर ले जाना, कुछ प्रक्रिया करना, फिर इसे वापस रखना होगा। यदि आपके पास कोई मान है जो आदिम डेटा प्रकार नहीं है, तो आपको केवल इसे बाहर निकालना होगा, इसे संसाधित करना होगा, इसे हैशपैप में वापस रखने की आवश्यकता नहीं है।


map.put(key, map.get(key) + 1);

ठीक होना चाहिए। यह मौजूदा मैपिंग के लिए मान अपडेट करेगा। ध्यान दें कि यह ऑटो-मुक्केबाजी का उपयोग करता है।





hashmap