簡體   English   中英

將HashMap排序到TreeMap中:自定義比較器使用相同的鍵刪除值

[英]Sorting HashMap into TreeMap: custom Comparator removes values with the same key

我正在嘗試對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
   }
}

我該如何解決?

我認為您以意想不到的方式使用地圖並違反合同是無法修復的。 樹圖期望按鍵排序,並且鍵應唯一,因此當compare == 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM