2016-04-18 3 views
1

So habe ich ein bisschen Schwierigkeiten zu verstehen, wie dies zu tun ist. Ich baue einen Wortzähler in Java mit Map<String, Integer>, wobei ein Wort die String ist und die Häufigkeit, mit der das Wort in einem .txt-Dokument gesagt wurde, ist Integer. Das funktioniert alles gut ... aber ich versuche ein Teil zu entwickeln, wo unten angezeigt wird, was die Top 5 Ergebnisse sind ---> was die Top 5 map.values() sind.Den Schlüssel aus dem Wert in der Karte finden

Das Problem, auf das ich gestoßen bin, ist, nachdem ich den Wert gefunden habe, kann ich den String damit nicht bekommen.

Alle Vorschläge wären sehr hilfreich für mich.

+0

'Map ' genannt wird WORDCOUNT – kwolff7

Antwort

2

Sie müssen die Map.Entry<String, Integer> verwenden, um das Paar Schlüssel und Wert zu erhalten.

Die Methode values() gibt nur Werte zurück, während die Methode keySet() nur die Schlüssel zurückgibt.

Zuerst sollten Sie Ihre Karte basierend auf Werten sortieren, um die ersten fünf Ergebnisse zu erhalten. Der direkte Ansatz verwendet eine Comparator. Siehe die Antwort here für mehr.

Dann erhalten Sie einfach die ersten fünf Einträge der map.getEntrySet(). Es wäre einfacher, hierfür eine Iterator zu verwenden.

UPDATE:

Set<Entry<String, Integer>> set = wordCount.entrySet(); 
    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set); 
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 
     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
      return o2.getValue().compareTo(o1.getValue()); 
     } 
    }); 

    int topResults = 5; 
    Iterator<Entry<String, Integer>> iter = list.iterator(); //refer the sorted collection 
    while (iter.hasNext() && topResults > 0) { 
     Map.Entry<String, Integer> entry = iter.next(); 
     System.out.println(entry.getKey() + "->" + entry.getValue()); 
     topResults --; 
    } 
+0

Ihr Code sagt nur das, was die Werte für die ersten 5 Werte sind. Zeigt nicht den höchsten Wert an, dann die zweithöchste, etc. – kwolff7

+0

Dieser Codeabschnitt wird verwendet, nachdem Sie einen Collections.sort erstellt haben, wobei der komparatorbasierte Ansatz verwendet wird, wie in der verknüpften Antwort gezeigt. – SarathChandra

+0

Ich legte über was ich versuchte, es hat immer noch nicht funktioniert, habe ich es falsch gemacht? – kwolff7

0

a) Iterate über die Karte, auf diese Weise Sie beide Tasten und Werte erreichbar:

b) eine zweite Karte für Reverse-Lookup bauen, z.B. Karte - beachten Sie, dass dies wahrscheinlich keine gute Idee ist, da Sie möglicherweise doppelte Schlüssel haben (gleiche Nummer für verschiedene Wörter)

c) überlegen, eine Bidimap verwenden - das ist eine Karte, die Sie sowohl nach Schlüssel und nach Wert abfragen können .

0

Ich schlage vor, Sie Comparator außer Kraft zu setzen und Ihre Map Konstruktor darauf aufbauen basiert. -Code ist unten gezeigt:

class ValueComparator implements Comparator { 
    Map map; 

    public ValueComparator(Map map) { 
     this.map = map; 
    } 

    public int compare(Object keyA, Object keyB) { 
     Comparable valueA = (Comparable) map.get(keyA); 
     Comparable valueB = (Comparable) map.get(keyB); 
     return valueB.compareTo(valueA); 
    } 
} 

public class YourClass{ 
    public static void main(String[] args) { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(); 
     map.put("a", 10); 
     map.put("b", 30); 
     map.put("c", 50); 
     map.put("d", 40); 
     map.put("e", 20); 
     System.out.println(map); 

     Map sortedMap = sortByValue(map); 
     System.out.println(sortedMap); 
    } 

    public static Map sortByValue(Map unsortedMap) { 
     Map sortedMap = new TreeMap(new ValueComparator(unsortedMap)); 
     sortedMap.putAll(unsortedMap); 
     return sortedMap; 
    } 

} 
+0

[* "Was ist ein Rohtyp und warum sollten wir ihn nicht verwenden?" *] (Http://Stackoverflow.com/q/2770321/2891664) Ihr 'ValueComparator' löscht auch Einträge mit doppelten Werten. – Radiodef