第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

向 TreeMap 添加條目時拋出 NullPointerException

向 TreeMap 添加條目時拋出 NullPointerException

慕工程0101907 2021-12-10 10:09:34
以下代碼在tm.put("dd",7);. 為什么是這樣?我已經(jīng)添加了調(diào)試,看起來我的比較函數(shù)是錯誤的,但我委托給 String.compare。如何修復它以便我可以向 TreeMap 添加新條目并自動按 VALUE 對新條目進行排序?謝謝。編輯我遇到的問題是,據(jù)我所知,TreeMap 應該連續(xù)排序 - 您應該能夠?qū)l目添加到已經(jīng)填充的 TM 中,并按排序順序保持地圖。到目前為止給出的解決方案不允許我這樣做。當我添加 ("cc",7) 時,我希望該條目根據(jù)我提供給構(gòu)造函數(shù)的比較器“插入”。這應該是可能的,不是嗎?EDIT2我現(xiàn)在可以看到這可能是不可能的,因為比較器對象用于查找值的映射是在構(gòu)造時提供的。可能有辦法解決這個問題,但我看不到它。static void f16(){        Map<String,Integer> hm = new HashMap<>();        hm.put("xx",5);        hm.put("xz",6);        hm.put("cx",9);        hm.put("ax",2);        class ValueComparator implements Comparator<String> { //satisfies Comparator<K> req of TreeMap const            Map<String,Integer> map;            ValueComparator(Map<String,Integer> map){                this.map=map;            }            public int compare(String k1, String k2){                System.out.printf("k1:%s k2:%s\n",k1,k2);//for debugging                return this.map.get(k1).compareTo(this.map.get(k2));            }        }        ValueComparator valueComp = new ValueComparator(hm);        NavigableMap<String,Integer> tm = new TreeMap<>(valueComp);        tm.putAll(hm);        System.out.println(tm);                tm.put("dd",7); //throws NPE        System.out.println(tm);  }控制臺輸出:k1:xx k2:xxk1:xz k2:xxk1:cx k2:xxk1:cx k2:xzk1:ax k2:xzk1:ax k2:xx{ax=2, xx=5, xz=6, cx=9}k1:dd k2:xzException in thread "main" java.lang.NullPointerException        at T1$1ValueComparator.compare(T1.java:28)        at T1$1ValueComparator.compare(T1.java:21)        at java.util.TreeMap.put(TreeMap.java:552)        at T1.f16(T1.java:35)        at T1.main(T1.java:10)
查看完整描述

2 回答

?
斯蒂芬大帝

TA貢獻1827條經(jīng)驗 獲得超8個贊

很明顯,HashMap比較里面有沒有條目"dd":只"xx","xz","cx",和"ax"映射。這就是在等于時this.map.get(k1)產(chǎn)生的原因。nullk1"dd"


之后你調(diào)用compareTo結(jié)果get


this.map.get(k1).compareTo(this.map.get(k2));

//               ---------

它產(chǎn)生一個 NPE。


要解決此問題,請?zhí)砑右恍┨娲椒▉肀容^映射中沒有鍵的對象 - 例如,通過比較鍵本身:


public int compare(String k1, String k2){

    System.out.printf("k1:%s k2:%s\n",k1,k2);//for debugging

    Integer v1 = this.map.get(k1);

    Integer v2 = this.map.get(k2);

    if (v1 != null && v2 == null) {

        return -1;

    }

    if (v1 == null && v2 != null) {

        return 1;

    }

    return (v1 != null && v2 != null) ? v1.compareTo(v2) : k1.compareTo(k2);

}


查看完整回答
反對 回復 2021-12-10
?
皈依舞

TA貢獻1851條經(jīng)驗 獲得超3個贊

問題出現(xiàn)在這里 return this.map.get(k1).compareTo(this.map.get(k2));

您已經(jīng)預定義了地圖,this.map=map;但是如果您添加一個元素,則會調(diào)用比較器。但是由于該元素不在地圖上還this.map.get(k1)返回null。這就是為什么你得到null.compareTo(...)導致異常的原因。


查看完整回答
反對 回復 2021-12-10
  • 2 回答
  • 0 關注
  • 392 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號