2010-11-21 14 views
6

मैं HashMapहैश मैप में पहले कैसे पुनरावृत्ति?

items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

मैं प्रत्येक पहले करने के लिए पिछले के लिए की जरूरत है।

"C", "3" 
"B", "2" 
"A", "1" 
+0

अंतिम और सबसे पहले शब्द इंगित करने लगते हैं। अधिकांश उत्तरों में मुझे लगता है कि अंतिम और प्रथम अर्थपूर्ण हैं (उदा। सी ए से बड़ा है और इस प्रकार अंतिम)। ऑर्डरर्ड मैप्स आपकी मदद नहीं करेगा अगर आपको सम्मिलन समय ऑर्डरिंग की आवश्यकता है और कुंजी में सम्मिलन टाइमस्टैम्प नहीं है। – extraneon

+1

'हैश मैप' अपने तत्वों के लिए किसी ऑर्डर की गारंटी नहीं देता है। विशेष रूप से, यह गारंटी नहीं देता है कि आदेश समय के साथ स्थिर रहता है। इस प्रकार, 'हैश मैप' वह नहीं है जो आप चाहते हैं यदि आपको किसी भी प्रकार का ऑर्डर बनाए रखना है। – barjak

उत्तर

4

संपादित करें: मेरे और मैथ्यू के स्पष्ट रूप से आपके प्रश्न का क्या अर्थ है इसकी अलग-अलग व्याख्याएं हैं। क्या आपका मतलब है कि आपके द्वारा डाला गया रिवर्स ऑर्डर, या चाबियों के रिवर्स ऑर्डर?

तुम्हारा मतलब तो चाबियों का क्रम को उल्टा, यहाँ इसे कैसे करना है:

एक आदेश दिया मानचित्र का उपयोग करें और ट्री-मैप की तरह है, तो items.keySet से अधिक पुनरावृति()। अपनी चाबी का एक SortedSet बना सकते हैं -

Map<String, String> items = new TreeMap<String, String>(new Comparator<String>() { 
    public int compare(String a, String b) { 
    return b.compareTo(a); 
    } 
}); 

items.put("A", "1"); 
items.put("B", "2"); 
items.put("C", "3"); 

for (String s: items.keySet()) { 
    System.out.println(s + " " + items.get(s)); 
} 
+3

यह कोड समकक्ष है: 'मानचित्र <स्ट्रिंग, स्ट्रिंग> आइटम = नया ट्रीमैप <स्ट्रिंग, स्ट्रिंग> (संग्रह। रिवर्सऑर्डर()); ' – barjak

+0

ओह कूल - – iftheshoefritz

1

HashMap किसी भी आदेश गारंटी नहीं है। यदि आप LinkedHashMap का उपयोग करते हैं, तो इसे सम्मिलन द्वारा आदेश दिया जाएगा, लेकिन अभी भी पीछे जाने का कोई सुविधाजनक तरीका नहीं है।

एक तरीका items.entrySet() पर कॉल करना होगा। यह Set<Map.Entry> देता है। फिर आप सेट का आकार प्राप्त कर सकते हैं, toArray() पर कॉल करें, फिर लूप के लिए अवरोही करें।

0

एक अन्य विधि: अपने प्रमुख मूल्यों की प्राकृतिक व्यवस्था से

ट्री-मैप प्रकार है, तो आप उलटे क्रम में चाबियाँ सॉर्ट करने के लिए निर्माता के लिए एक तुलनित्र में पारित करने के लिए की आवश्यकता होगी :

import java.util.*; 

class MyComparator implements Comparator<String> { 
    public int compare(String a, String b) { 
     return -a.compareTo(b); 
    } 

    public boolean equals(String a, String b) { 
     return a.equals(b); 
    } 
} 

public class test { 
    public static void main(String[] args) { 
     HashMap<String, String> items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

     TreeSet<String> ts = new TreeSet<String>(new MyComparator()); 
     ts.addAll(items.keySet()); 
     for(Iterator<String> i = ts.iterator(); i.hasNext();) { 
      String key = i.next(); 
      System.out.println("key: " + key + ", value: " + items.get(key)); 
     } 
    } 
} 

उत्पादन:

 
key: C, value: 3 
key: B, value: 2 
key: A, value: 1 
+0

से पहले नहीं देखा था कि आप मानते हैं कि अंतिम संदर्भ में है कुंजी, लेकिन मुझे लगता है कि वह सम्मिलन का मतलब था। यदि सम्मिलन समय कुंजी में नहीं है तो एक तुलनित्र आपकी मदद नहीं कर सकता है। – extraneon

+0

मैं असहमत हूं। मुझे नहीं लगता कि सम्मिलन समय के साथ इसके साथ कुछ लेना देना है। मुझे लगता है कि उसने सोचने की गलती की है कि हैश मैप को कुछ क्रम में पुनरावृत्त किया जा सकता है, और इसे उलटना चाहता है। मैं मान रहा हूं कि उसका मतलब वर्णमाला था। – sje397

6

आप NavigableMap (TreeMapNavigableMap) का उपयोग कर सकते हैं, जो नेविगेशन क्षमताओं के साथ SortedMap है।

NavigableMap#descendingMap() इस मानचित्र में निहित मैपिंग के एक रिवर्स ऑर्डर व्यू (प्रतिलिपि नहीं) देता है।

उदाहरण:

NavigableMap<String, String> items = new TreeMap<String, String>(); 
items.put("B", "2"); 
items.put("A", "1"); 
items.put("C", "3"); 

for (Map.Entry<String, String> e : items.entrySet()) { 
    System.out.println(e); 
} 
// gives 
// A=1 
// B=2 
// C=3 

for (Map.Entry<String, String> e : items.descendingMap().entrySet()) { 
    System.out.println(e); 
} 

// gives 
// C=3 
// B=2 
// A=1 

नोट: यह जवाब मान्य है अगर आप अपने Map में चाबियों का प्राकृतिक आदेश के बारे में परवाह। यदि आप सम्मिलन आदेश या एक्सेस ऑर्डरिंग की परवाह करते हैं, तो LinkedHashMap पर एक नज़र डालें।

नोट 2: आपके प्रश्न में, आपने HashMap का उपयोग किया था। कृपया ध्यान दें कि HashMap अपने तत्वों के लिए किसी भी आदेश की गारंटी नहीं देता है। असल में, यह गारंटी भी नहीं देता कि आदेश समय के साथ स्थिर रहेगा। आगे संदर्भों के लिए HashMap के javadoc का पहला पैराग्राफ देखें।

+0

आदेश कुंजी अर्थशास्त्र पर आधारित है। लेकिन मुझे लगता है कि सवाल सम्मिलन समय के बारे में है। तो एक रिवर्स ऑर्डर आपकी मदद नहीं करेगा क्योंकि ऑर्डर मानदंड (सम्मिलन समय) कुंजी का हिस्सा नहीं है। – extraneon

+0

मैंने चीजों को स्पष्ट करने के लिए एक नोट जोड़ा – barjak

संबंधित मुद्दे