我正在嘗試對HashMap<String, Long>. 我有以下排序代碼:private static class ValueComparator implements Comparator<String>{ HashMap<String, Long> map = new HashMap<String, Long>(); public ValueComparator(HashMap<String, Long> map){ this.map.putAll(map); } @Override public int compare(String s1, String s2) { if(map.get(s1) > map.get(s2)){ System.out.println("s1: " + s1 + "; s2: " + s2); return -1; } else if (map.get(s1).equals(map.get(s2))) { return 0; } else{ return 1; } } }private static TreeMap<String, Long> sortMapByValue(HashMap<String, Long> map){ Comparator<String> comparator = new ValueComparator(map); //TreeMap is a map sorted by its keys. //The comparator is used to sort the TreeMap by keys. TreeMap<String, Long> result = new TreeMap<String, Long>(comparator); result.putAll(map); System.out.println("DONE sort"); return result; }問題是,當幾個不同的鍵具有相同的值時,只有一個鍵會進入最終映射:例子: public class Test { public static void main(String[] args) { HashMap<String, Long> hashMap = new HashMap<>(); hashMap.put("Cat", (long) 4); hashMap.put("Human", (long) 2); hashMap.put("Dog", (long) 4); hashMap.put("Fish", (long) 0); hashMap.put("Tree", (long) 1); hashMap.put("Three-legged-human", (long) 3); hashMap.put("Monkey", (long) 2); System.out.println(hashMap); //7 pairs System.out.println(sortMapByValue(hashMap)); //5 pairs }}我將如何修復它?
1 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
我認為您以非預期的方式使用地圖并違反合同是不可修復的。樹圖期望按鍵排序,鍵應該是唯一的,所以當比較 == 0 時,它只會覆蓋節點的值。你總是可以實現你自己的 TreeMap 并讓它做你想做的任何事情。
我不確定你想用它做什么,但我認為你需要像
TreeMap<Long,List<String>>
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/TreeMap.java
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
添加回答
舉報
0/150
提交
取消