2013-03-15 8 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि HashMap से मुझे शीर्ष 10 मान कैसे प्राप्त हो सकते हैं। मैं शुरुआत में TreeMap का उपयोग करने की कोशिश कर रहा था और इसे मूल्य से क्रमबद्ध कर रहा हूं और फिर पहले 10 मानों को लेता हूं, हालांकि ऐसा लगता है कि यह विकल्प नहीं है, क्योंकि TreeMap कुंजी द्वारा टाइप किया गया है।हैश मानचित्र में शीर्ष 10 मान प्राप्त करें

मैं अभी भी यह जानना चाहता हूं कि कौन सी चाबियाँ उच्चतम मान हैं, मानचित्र के K, V हैं।

+4

क्या आप शीर्ष 10 मतलब है? किस पर आधारित? – jsedano

+0

क्या आप कुछ कोड पोस्ट कर सकते हैं यह दिखाने के लिए कि आप किस तरह के तत्वों की तुलना कर रहे हैं? –

+0

ट्रीमैप आपके लिए सॉर्टिंग कर सकता है। लेकिन हमें यह जानने के लिए कि आप इसे किस तरह से हल करने की कोशिश कर रहे हैं, हमें बताना है! – Kevin

उत्तर

0

मुझे डर है कि आपको पूरे मानचित्र पर फिर से भरना होगा। शीर्ष के तत्वों को खोजने के लिए आमतौर पर उपयोग की जाने वाली डेटा संरचना है, जैसा कि this book में बताया गया है।

0

आप नक्शे के 10 उच्चतम मूल्यों को प्राप्त करने की कोशिश कर रहे हैं, तो (यह मानते हुए मान सांख्यिक या कम से कम तुलनीय को लागू कर रहे हैं) तो यह प्रयास करें:

List list = new ArrayList(hashMap.values()); 
Collections.sort(list); 
for(int i=0; i<10; i++) { 
    // Deal with your value 
} 
+0

यह केवल तभी काम करेगा जब मान प्रकार 'Foo' लागू करता है' तुलनात्मक 'और आप कच्चे प्रकार की सूची का उपयोग नहीं करते हैं। – jlordo

+0

यदि ओपी ने अपने प्रश्न में निर्दिष्ट किया तो मैंने कच्चा प्रकार रखा होगा :) – aymeric

2

हो सकता है कि आप अपने मूल्य को Comparable इंटरफ़ेस को लागू करना चाहिए हैशपैप में संग्रहीत वस्तुओं। तो फिर तुम सभी मूल्यों की एक सरणी सूची बना सकते हैं:

List<YourValueType> l = new ArrayList<YourValueType>(hashmap.values()); 
Collection.sort(l); 
l = l.subList(0,10); 

सादर

+0

काफी अच्छा समाधान। मुझे बस कुछ इसी तरह की जरूरत थी। चूंकि आप केवल मूल्य प्रदान कर रहे हैं, लेकिन मुझे चाबियों की भी आवश्यकता है। मैंने थोड़ा सा संशोधन किया और प्रवेश सेट का उपयोग करने के लिए एक तुलनाकर्ता जोड़ा। तुलनित्र को प्रवेश मानों को अवरोही क्रम में तुलना करना है। सूची <प्रविष्टि <स्ट्रिंग, इंटीजर >> परिणाम = नया ArrayList <> (hashmap.entrySet()); संग्रह .sort (परिणाम, नया EntryComparator()); परिणाम = results.subList (0, 10); – sebadagostino

+1

मैं इसे एक और उत्तर के रूप में जोड़ रहा हूं क्योंकि यह टिप्पणी के रूप में खराब दिखता है – sebadagostino

0

मान लेते हैं तो आप एक मानचित्र करते हैं, लेकिन इस उदाहरण

Map<String, String> m = yourMethodToGetYourMap(); 
List<String> c = new ArrayList<String>(m.values()); 
Collections.sort(c); 
for(int i=0 ; i< 10; ++i) { 
    System.out.println(i + " rank is " + c.get(i)); 
} 
2
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class Testing { 

    public static void main(String[] args) { 

     HashMap<String,Double> map = new HashMap<String,Double>(); 
     ValueComparator bvc = new ValueComparator(map); 
     TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc); 

     map.put("A",99.5); 
     map.put("B",67.4); 
     map.put("C",67.4); 
     map.put("D",67.3); 

     System.out.println("unsorted map: "+map); 

     sorted_map.putAll(map); 

     System.out.println("results: "+sorted_map); 
    } 
} 

class ValueComparator implements Comparator<String> { 

    Map<String, Double> base; 
    public ValueComparator(Map<String, Double> base) { 
     this.base = base; 
    } 

    // Note: this comparator imposes orderings that are inconsistent with equals.  
    public int compare(String a, String b) { 
     if (base.get(a) >= base.get(b)) { 
      return -1; 
     } else { 
      return 1; 
     } // returning 0 would merge keys 
    } 
} 
+0

ओह वाह, मुझे लगता है कि यह सिर्फ ऐसा कर सकता है, इसे अब एक शॉट देने जा रहा है, धन्यवाद! – Tohmas

+0

@ विश्वजित, क्या आप मुझे इस कोड की जटिलता समझा सकते हैं?आपका कोड पूरी तरह से काम कर रहा है और यह बहुत आसान तरीका है, बस इस कोड की जटिलता की गणना करना चाहता था .... – Rushi

+0

@ विश्वजित, आप कोड बहुत अच्छा है, लेकिन आप कैसे सुनिश्चित करते हैं कि TreeMap का आकार हर समय 10 है? क्योंकि आप केवल शीर्ष दस सही करना चाहते हैं? हर बार जब आप ट्री मैप में एक कुंजी-मूल्य जोड़ी डालते हैं, तो आपको यह जांचना होगा कि वर्तमान आकार दस से अधिक है, यदि ऐसा है, तो आपको TreeMap में सबसे छोटी कुंजी-मूल्य जोड़ी को हटाना होगा। कोड में यह अंतिम भाग कैसे करते हैं? मैंने नहीं सोचा था कि लोग यहां मेरे प्रश्न का उत्तर देंगे, इसलिए मैंने इस पोस्ट का संदर्भ देने वाले एक नए प्रश्न से पूछा [यहां] (http://stackoverflow.com/questions/37244198/how-to-maintain-a-java-treemap-size करने वाली हो एक निरंतर जबकि जोड़ने-की-वैल्यू-जोड़ी) –

0

के किसी भी प्रकार के लिए काम कर सकते हैं मैं इस जवाब में sk2212

से पहले इसका उत्तर देता हूं इस तरह के गुण "hashmap" के लिए इस एक के रूप में

class EntryComparator implements Comparator<Entry<String,Integer>> { 

    /** 
    * Implements descending order. 
    */ 
    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
     if (o1.getValue() < o2.getValue()) { 
      return 1; 
     } else if (o1.getValue() > o2.getValue()) { 
      return -1; 
     } 
     return 0; 
    } 

} 

तो फिर तुम यह एक तरीका है में उपयोग कर सकते हैं: एक अवरोही तुलनित्र लागू करने की आवश्यकता

public List<Entry<String,Integer>> getTopKeysWithOccurences(int top) { 
    List<Entry<String,Integer>> results = new ArrayList<>(hashmap.entrySet()); 
    Collections.sort(results, new EntryComparator()); 
    return results.subList(0, top); 
} 
संबंधित मुद्दे