क्या हशमप कुंजी का नाम बदलना संभव है?


92

मैं एक हशमप कुंजी का नाम बदलने के लिए रास्ता खोज रहा हूं, लेकिन मुझे नहीं पता कि यह जावा में संभव है या नहीं।


11
गोश, मुझे आशा है कि नहीं। कुंजी / मान जोड़ी को हटाना और पुन: दर्ज करना, जाने के तरीके की तरह लगता है। ध्यान दें कि आप सामान्य रूप से वैसे भी नक्शे में केवल संदर्भों को संभालते हैं।
मार्टेन बोदवेस

4
कृपया हैश प्रविष्टि की कुंजी को संशोधित न करें! यदि आप भाग्यशाली हैं, तो आप इसे उसी हैशकोड के साथ किसी चीज़ में बदल देंगे और आप कुछ पागल हो जाएंगे जो यह पता लगाने की कोशिश कर रहे हैं कि क्या हुआ; यदि आप बदकिस्मत हैं, तो आप एक प्रविष्टि के साथ समाप्त हो जाएंगे जिसे पाया नहीं जा सकता है (अच्छी तरह से, पूरी तालिका के अगले पुनर्निर्माण तक नहीं)। निकालें / पुनर्स्थापना बहुत साफ है, और बहुत सस्ता होना चाहिए (यह सभी संदर्भ है, सब के बाद)।
डोनल फैलो

जवाबों:


140

तत्व को हटाने और नए नाम के साथ फिर से डालने का प्रयास करें। आपके नक्शे में कुंजियों को मानते हुए String, इसे इस तरह से प्राप्त किया जा सकता है:

Object obj = map.remove("oldKey");
map.put("newKey", obj);

61
+1। और पढ़ने के लिए सबसे सरल है map.put( "newKey", map.remove( "oldKey" ) );और इसमें शामिल हैoldKey
रविंदर रेड्डी

15
जहां तक ​​पठनीयता का सवाल है, मैं काफी असहमत हूं, मैं व्यक्तिगत रूप से स्पष्ट रूप से देखना पसंद करता हूं कि कोई ऑब्जेक्ट नक्शे से हटा दिया जाता है, और फिर जोड़ा जाता है। और चूंकि ओपी जावा के लिए बहुत नया है, इसलिए मैंने इसे इस तरह से रखने का फैसला किया। हालाँकि प्रदर्शन के लिए, आपका संस्करण निश्चित रूप से पसंद किया जाता है (क्योंकि मुझे नहीं लगता कि संकलक मेरे संस्करण को आपके तरीके से अनुकूलित करेगा)।
एलेक्सिस कबूतर

3
जावाैक 1.8.0_45 के लिए, एक-लाइन संस्करण दो बाईटेकोड्स छोटा है, जिसने मुझे आश्चर्यचकित किया। अधिक annoyingly जेनरिक के साथ पारित नहीं हो सकता objकरने के लिए putयह कास्टिंग या किसी अन्य प्रकार के रूप में यह घोषित करने के बिना, लेकिन निश्चित रूप से परिणाम में उत्तीर्ण होने की removeसीधे काम करता है।
शमूएल एडविन वार्ड

1
लेकिन सभी कुंजी का नाम कैसे बदलें
gstackoverflow


20
hashMap.put("New_Key", hashMap.remove("Old_Key"));

यह वही करेगा जो आप चाहते हैं लेकिन, आप देखेंगे कि कुंजी का स्थान बदल गया है।


@Vins दस्तावेज़ों को फिर से देखें: डी, ​​निकालें () ऑब्जेक्ट को वापस करेगा, इस tutorialspoint.com/java/util/hashmap_remove.htm की
मोहम्मद ज़कारिया एल-ज़ोग्बी

1
मेरे बुरे, मैंने अपनी टिप्पणी को हटा दिया है और इसके लिए मतदान किया है। उसके लिए माफ़ करना।
Vins

19

कुंजी का मान निर्दिष्ट करें, जिसका नाम बदलकर एक नई कुंजी करने की आवश्यकता है। और पुरानी चाबी को हटा दें।

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");

10

आप हैशमैप का नाम बदल / संशोधित नहीं कर सकते keyएक बार जोड़े ।

इसका एक ही तरीका है कि keyनए keyऔर जोड़े को हटाना और हटाना value

कारण : हैशमैप आंतरिक कार्यान्वयन में हाशमkeyसंशोधक के रूप में चिह्नित किया गया हैfinal

static class Entry<K ,V> implements Map.Entry<K ,V>
{
    final K key;
    V value;
    Entry<K ,V> next;
    final int hash;
    ...//More code goes here
}

संदर्भ के लिए: HashMap


यह मेरी राय में सबसे अच्छा जवाब है क्योंकि एक कुंजी का नाम बदलना संभव नहीं है।
वोल्फसन

4

आप एक हैशमैप कुंजी का नाम नहीं बदलते हैं, आपको नई कुंजी के साथ एक नई प्रविष्टि सम्मिलित करनी होगी और पुरानी को हटाना होगा।


2

मैं तर्क देता हूँ कि हैमैप कीज़ का सार इंडेक्स एक्सेस उद्देश्यों के लिए है और अधिक कुछ नहीं है, लेकिन यहाँ एक हैक है: कुंजी के मूल्य के चारों ओर एक की-रैपर क्लास बनाना इसलिए की-रैपर ऑब्जेक्ट इंडेक्स एक्सेस के लिए हैशमैप कुंजी बन जाता है, इसलिए आप अपनी विशिष्ट आवश्यकताओं के लिए की-रैपर ऑब्जेक्ट के मूल्य को एक्सेस और बदल सकते हैं:

public class KeyWrapper<T>{

      private T key;
      public KeyWrapper(T key){
         this.key=key;
       }

      public void rename(T newkey){
              this.key=newkey;
       }

}

उदाहरण

   HashMap<KeyWrapper,String> hashmap=new HashMap<>();
   KeyWrapper key=new KeyWrapper("cool-key");
   hashmap.put(key,"value");
   key.rename("cool-key-renamed");

यद्यपि आपके पास एक गैर मौजूदा कुंजी भी हो सकती है जो हैशमैप से मौजूदा कुंजी का मूल्य प्राप्त करने में सक्षम हो, लेकिन मुझे डर है कि यह आपराधिक हो सकता है, वैसे भी:

public  class KeyWrapper<T>{

        private T key;
        public KeyWrapper(T key){
            this.key=key;
        }

        @Override
        public boolean equals(Object o) {
            return hashCode()==o.hashCode();
        }

        @Override
        public int hashCode() {
            int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some point
            return hash;
        }
    }

उदाहरण

HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper cool_key=new KeyWrapper("cool-key");
KeyWrapper fake_key=new KeyWrapper("fake-key");
hashmap.put(cool_key,"cool-value");
System.out.println("I don't believe it but its: "+hashmap.containsKey(fake_key)+" OMG!!!");

1

कृपया नीचे दिए गए बिंदुओं को देखें:

  1. नहीं, आप एक बार जोड़े जाने keyका नाम नहीं बदल सकते HashMap

  2. बहुत पहले आपको उसे हटाना या हटाना होगा keyऔर फिर आप नए के keyसाथ सम्मिलित कर सकते हैं value

  3. क्योंकि HashMapआंतरिक कार्यान्वयन में HashMapप्रमुख संशोधक है final


0

यदि आप जावा मूल हैशपॉप के बजाय आप एक Bimap का उपयोग करेंगे ।
यह पारंपरिक मानचित्र कार्यान्वयन नहीं है, और आपको यह सुनिश्चित करने की आवश्यकता है कि यह आपकी आवश्यकताओं के अनुरूप है।

एक बिमाप (या "बिडायरेक्शनल मैप") एक ऐसा नक्शा है जो अपने मूल्यों की विशिष्टता के साथ-साथ उसकी कुंजियों को भी संरक्षित करता है। यह बाधा एक "उलटा दृश्य" का समर्थन करने के लिए बिमैप्स को सक्षम करती है, जो कि इस बिमप के समान प्रविष्टियों के साथ एक और बिमैप है लेकिन उलट की और मूल्यों के साथ।

बिमाप का उपयोग करके, आप दृश्य को उलटा कर सकते हैं और कुंजी को बदल सकते हैं।
Apache Commons BidiMap और Guava BiMap दोनों को चेकआउट करें ।


0

मेरे मामले में एक नक्शा था जिसमें वास्तविक कुंजी नहीं थी -> वास्तविक चाबियाँ, इसलिए मुझे अपने नक्शे में वास्तविक के साथ वास्तविक नहीं बदलना था (विचार दूसरों की तरह है)

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.