2017-10-02 5 views
0

Ich habe eine HashMap, die Zeichen zu einem Integer zuordnen. Um es nach Wert zu sortieren, habe ich meinen Komparator geschrieben und benutze TreeMap. Aber mir fehlt der Wert. Ich habe das für String "tree" überprüft. Meine map 'chars' nach jeder Schleife sieht aus wie {r = 1, t = 1, e = 2} und Baum nach putAll (zwei Zeilen später) ist {e = 2, r = 1}. Was passiert mit Char 't'? Warum wird es verpasst? Und wie kann ich es ändern?Fehlender Wert in einer TreeMap nach PutAll()

+2

Ihr Komparator hält "r" und "t" für gleich. Die Karte wird nicht zwei Einträge für gleiche Schlüssel haben. – user2357112

+0

Ich verstehe es. Aber ich weiß nicht, was ich dagegen tun soll ... kannst du mir einen Hinweis geben? – Malvinka

+0

Eine Möglichkeit wäre, keine TreeMap für die Sortierung zu verwenden. – user2357112

Antwort

2

Ihre ValueComparator behandelt Einträge mit der gleichen Anzahl wie Duplikate. Eine einfache Lösung ist es, den Schlüssel als Tie-Break zu verwenden:

public int compare(Character a, Character b) { 
    int result = map.get(b).compareTo(map.get(a)); 
    return result != 0 ? result : a.compareTo(b); 
} 

Alternativ können Sie Streams verwenden, um die Frequenzzuordnung zu erstellen, es zu sortieren und speichern Sie es eine geordnete LinkedHashMap:

Map<Character, Integer> counts = s.chars() 
     .mapToObj(i -> (char)i) 
     .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(c -> 1))) 
     .entrySet() 
     .stream() 
     .sorted(Collections.reverseOrder(Entry.comparingByValue())) 
     .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new));