मैं LinkedHashMap बात से सहमत हूं। जब मैं समस्या का सामना कर रहा था तब मैं अपने निष्कर्षों और अनुभव को लगा रहा था, जब मैं चाबियों द्वारा हाशप को हल करने की कोशिश कर रहा था।
HashMap बनाने के लिए मेरा कोड:
HashMap<Integer, String> map;
@Before
public void initData() {
map = new HashMap<>();
map.put(55, "John");
map.put(22, "Apple");
map.put(66, "Earl");
map.put(77, "Pearl");
map.put(12, "George");
map.put(6, "Rocky");
}
मेरे पास एक फंक्शन शो-रूम है जो नक्शे की प्रविष्टियों को प्रिंट करता है:
public void showMap (Map<Integer, String> map1) {
for (Map.Entry<Integer, String> entry: map1.entrySet()) {
System.out.println("[Key: "+entry.getKey()+ " , "+"Value: "+entry.getValue() +"] ");
}
}
अब जब मैं छँटाई करने से पहले नक्शा प्रिंट करता हूँ, तो यह अनुक्रम के बाद प्रिंट करता है:
Map before sorting :
[Key: 66 , Value: Earl]
[Key: 22 , Value: Apple]
[Key: 6 , Value: Rocky]
[Key: 55 , Value: John]
[Key: 12 , Value: George]
[Key: 77 , Value: Pearl]
यह मूल रूप से उस क्रम से अलग है जिसमें मानचित्र कुंजी लगाई गई थी।
अब जब मैं इसे मानचित्र कुंजियों के साथ क्रमबद्ध करता हूं:
List<Map.Entry<Integer, String>> entries = new ArrayList<>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<Integer, String>>() {
@Override
public int compare(Entry<Integer, String> o1, Entry<Integer, String> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
HashMap<Integer, String> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("Putting key:"+entry.getKey());
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("Map after sorting:");
showMap(sortedMap);
बाहर रखा गया है:
Sorting by keys :
Putting key:6
Putting key:12
Putting key:22
Putting key:55
Putting key:66
Putting key:77
Map after sorting:
[Key: 66 , Value: Earl]
[Key: 6 , Value: Rocky]
[Key: 22 , Value: Apple]
[Key: 55 , Value: John]
[Key: 12 , Value: George]
[Key: 77 , Value: Pearl]
आप चाबियों के क्रम में अंतर देख सकते हैं। कुंजियों का क्रमबद्ध क्रम ठीक है, लेकिन कॉपी किए गए नक्शे की चाबियां फिर से पहले के नक्शे के उसी क्रम में हैं। मुझे नहीं पता कि यह कहना वैध है, लेकिन एक ही कुंजी के साथ दो हैशमैप के लिए, चाबियों का क्रम समान है। इसका तात्पर्य इस कथन से है कि कुंजियों के क्रम की गारंटी नहीं है, लेकिन मुख्य प्रविष्टि एल्गोरिथ्म की अंतर्निहित प्रकृति के कारण समान कुंजी वाले दो मानचित्रों के लिए समान हो सकता है यदि इस JVM संस्करण का HashMap कार्यान्वयन।
अब जब मैं HashMap को सॉर्ट की गई प्रविष्टियों को कॉपी करने के लिए LinkedHashMap का उपयोग करता हूं, तो मुझे वांछित परिणाम मिलता है (जो कि स्वाभाविक था, लेकिन वह बिंदु नहीं है। बिंदु हाशप की कुंजियों के क्रम के बारे में है)
HashMap<Integer, String> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("Putting key:"+entry.getKey());
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("Map after sorting:");
showMap(sortedMap);
आउटपुट:
Sorting by keys :
Putting key:6
Putting key:12
Putting key:22
Putting key:55
Putting key:66
Putting key:77
Map after sorting:
[Key: 6 , Value: Rocky]
[Key: 12 , Value: George]
[Key: 22 , Value: Apple]
[Key: 55 , Value: John]
[Key: 66 , Value: Earl]
[Key: 77 , Value: Pearl]