2012-10-18 30 views
19

मुझे ट्रीएप के लिए एक तुलनित्र की आवश्यकता है। क्या मुझे अपने वृक्ष मैप के लिए कन्स्ट्रक्टर में गुमनाम रूप से लिखना चाहिए? मैं अपना तुलनित्र कैसे लिख सकता हूं। वर्तमान में, जावा मेरी कोड पसंद नहीं करता है (मैं गुमनाम रूप से ऐसा कर सकते हैं?):जावा ट्रीएप कंप्रेटर

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>() 
    { 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) 
     { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
  1. मैं गुमनाम रूप से ऊपर कर सकता हूँ?
  2. मैं और यह कैसे कर सकता हूं?
  3. मैं नहीं कुंजी

उत्तर

42

आप कर सकते हैं प्रकार TreeMap मूल्यों पर नहीं।

एक रेड-ब्लैक पेड़ आधारित NavigableMap कार्यान्वयन। नक्शा को अपनी चाबियों के प्राकृतिक क्रम के अनुसार क्रमबद्ध किया जाता है, या मानचित्र निर्माण समय पर प्रदान किए गए तुलनात्मक द्वारा,पर निर्भर करता है कि आपको Comparator<? super K> के लिए प्रदान करना होगा ताकि आपके तुलनित्र को चाबियों की तुलना करनी चाहिए।

मूल्यों को क्रमबद्ध करने के लिए आपको SortedSet की आवश्यकता होगी।

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
      new Comparator<Map.Entry<String, Double>>() { 
       @Override 
       public int compare(Map.Entry<String, Double> e1, 
         Map.Entry<String, Double> e2) { 
        return e1.getValue().compareTo(e2.getValue()); 
       } 
      }); 

    sortedset.addAll(myMap.entrySet()); 

आपको एक उदाहरण

SortedMap<String, Double> myMap = new TreeMap<String, Double>(); 
    myMap.put("a", 10.0); 
    myMap.put("b", 9.0); 
    myMap.put("c", 11.0); 
    myMap.put("d", 2.0); 
    sortedset.addAll(myMap.entrySet()); 
    System.out.println(sortedset); 

आउटपुट देने के लिए उपयोग करें:

[d=2.0, b=9.0, a=10.0, c=11.0] 
+0

मैप मैप में एक समय में मैं तत्व कैसे जोड़ूं? myMap.add (Map.Entry <स्ट्रिंग, डबल> नया मानचित्र। एंटर्री <स्ट्रिंग, डबल> (vStr, cur)); – CodeKingPlusPlus

+0

@CodeKingPlusPlus नहीं। आप केवल पुट विधि का उपयोग करते हैं जो जोड़ा गया उदाहरण देखें। एक बार आपके द्वारा किए जाने के बाद मूल्यों को क्रमबद्ध करने के लिए सॉर्टेडसेट का उपयोग करके मानचित्र पर मूल्य डाल दें। –

+0

@AmitDeshpande शानदार उत्तर – Kushal

11

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

आप इस प्रकार कुछ करने के लिए इसे बदलना चाहिए

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>() 
    { 
     public int compare(String o1, String o2) 
     { 
      return o1.compareTo(o2); 
     } 
}); 

अद्यतन

इस प्रकार है (मानचित्र में प्रविष्टियों की एक सूची बना सकते हैं और मूल्य पर सूची आधार सॉर्ट आप कुछ कर सकते हैं, लेकिन ध्यान दें कि यह स्वयं मानचित्र) सॉर्ट करने के लिए नहीं जा रहा -

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet()); 
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() { 
     @Override 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
+0

@ कोडकिंगप्लसप्लस: आप मूल्यों के आधार पर मानचित्र को स्वयं क्रमबद्ध नहीं कर सकते हैं। लेकिन आप प्रविष्टियों की सूची प्राप्त कर सकते हैं और इसे सॉर्ट कर सकते हैं। लेकिन तब तक यह एक वृक्षारोपण नहीं हो सकता है, जब तक कि आप कुंजी और मूल्य स्विच न करें। –

0

आप कुंजी और मान स्वाइप कर सकते हैं। उदाहरण के लिए

 String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"}; 
     int[] v = {341, 273, 278, 329, 445}; 
     TreeMap<Integer,String>a=new TreeMap(); 
     for (int i = 0; i < k.length; i++) 
      a.put(v[i],k[i]);    
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
     a.remove(a.firstEntry().getKey()); 
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
+1

के लिए धन्यवाद यह अंतिम प्रश्न हल करने की कोशिश कर रहा है, लेकिन पहले दो नहीं। –