亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 HashMap 排序為 TreeMap:自定義 Comparator 刪除具有相同鍵的值

將 HashMap 排序為 TreeMap:自定義 Comparator 刪除具有相同鍵的值

楊__羊羊 2021-11-03 14:19:24
我正在嘗試對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);


查看完整回答
反對 回復 2021-11-03
  • 1 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號