मैं एक हशमप कुंजी का नाम बदलने के लिए रास्ता खोज रहा हूं, लेकिन मुझे नहीं पता कि यह जावा में संभव है या नहीं।
मैं एक हशमप कुंजी का नाम बदलने के लिए रास्ता खोज रहा हूं, लेकिन मुझे नहीं पता कि यह जावा में संभव है या नहीं।
जवाबों:
तत्व को हटाने और नए नाम के साथ फिर से डालने का प्रयास करें। आपके नक्शे में कुंजियों को मानते हुए String
, इसे इस तरह से प्राप्त किया जा सकता है:
Object obj = map.remove("oldKey");
map.put("newKey", obj);
map.put( "newKey", map.remove( "oldKey" ) );
और इसमें शामिल हैoldKey
obj
करने के लिए put
यह कास्टिंग या किसी अन्य प्रकार के रूप में यह घोषित करने के बिना, लेकिन निश्चित रूप से परिणाम में उत्तीर्ण होने की remove
सीधे काम करता है।
hashMap.put("New_Key", hashMap.remove("Old_Key"));
यह वही करेगा जो आप चाहते हैं लेकिन, आप देखेंगे कि कुंजी का स्थान बदल गया है।
आप हैशमैप का नाम बदल / संशोधित नहीं कर सकते 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
मैं तर्क देता हूँ कि हैमैप कीज़ का सार इंडेक्स एक्सेस उद्देश्यों के लिए है और अधिक कुछ नहीं है, लेकिन यहाँ एक हैक है: कुंजी के मूल्य के चारों ओर एक की-रैपर क्लास बनाना इसलिए की-रैपर ऑब्जेक्ट इंडेक्स एक्सेस के लिए हैशमैप कुंजी बन जाता है, इसलिए आप अपनी विशिष्ट आवश्यकताओं के लिए की-रैपर ऑब्जेक्ट के मूल्य को एक्सेस और बदल सकते हैं:
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!!!");
यदि आप जावा मूल हैशपॉप के बजाय आप एक Bimap का उपयोग करेंगे ।
यह पारंपरिक मानचित्र कार्यान्वयन नहीं है, और आपको यह सुनिश्चित करने की आवश्यकता है कि यह आपकी आवश्यकताओं के अनुरूप है।
एक बिमाप (या "बिडायरेक्शनल मैप") एक ऐसा नक्शा है जो अपने मूल्यों की विशिष्टता के साथ-साथ उसकी कुंजियों को भी संरक्षित करता है। यह बाधा एक "उलटा दृश्य" का समर्थन करने के लिए बिमैप्स को सक्षम करती है, जो कि इस बिमप के समान प्रविष्टियों के साथ एक और बिमैप है लेकिन उलट की और मूल्यों के साथ।
बिमाप का उपयोग करके, आप दृश्य को उलटा कर सकते हैं और कुंजी को बदल सकते हैं।
Apache Commons BidiMap और Guava BiMap दोनों को चेकआउट करें ।
मेरे मामले में एक नक्शा था जिसमें वास्तविक कुंजी नहीं थी -> वास्तविक चाबियाँ, इसलिए मुझे अपने नक्शे में वास्तविक के साथ वास्तविक नहीं बदलना था (विचार दूसरों की तरह है)
getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
if (map.containsKey(friendlyKey))
map.put(realKey, map.remove(friendlyKey))
);