2016-04-21 3 views
0

Ich benutze den folgenden Code, um meine hashmap nach ihrem Wert zu sortieren. Aber das Ergebnis scheint verwirrt, da es nur einen Eintrag für einen Wert enthält und einen anderen Eintrag mit doppeltem Wert entfernt. Hier ist der Comparator Code:warum unterschiedlicher Schlüssel mit dupliziertem Wert verschwindet, wenn der Transfer hashmap to treemap

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); 
    } 

Und hier ist, wie ich es verwenden:

TreeMap sortedMap=new TreeMap(new ValueComparator(allCandidateMap)); 
     sortedMap.putAll(allCandidateMap); 

Antwort

1

Das macht durchaus Sinn. Sie haben deklariert, dass wenn zwei Schlüssel in allCandidateMap gleichen Werten zugeordnet werden, sie als gleichwertig betrachtet werden sollten, da compare0 zurückgibt.

Worauf das zurückzuführen ist, ist, dass Ihr Komparator die Rollen von Schlüssel und Wert fast umgekehrt hat. Wenn Sie versuchen, andere Operationen auszuführen, werden Sie wahrscheinlich feststellen, dass sich die Werte der Map oft wie Schlüssel verhalten. Methoden wie get und containsKey verhalten sich so, als würden sie nach den Werten suchen, nicht nach den Schlüsseln (aber dann gibt get den übergebenen Wert zurück, also sind die Werte auch noch Werte). Der Komparator definiert das Verhalten der TreeMap, und Sie haben für sehr seltsames Verhalten gefragt.

Verwandte Themen