簡體   English   中英

使用自定義比較器時,TreeSet 拋出空指針異常

[英]TreeSet throws nullpointer exception when using custom comparator

當我嘗試刪除樹集中的特定元素(非空)時收到錯誤消息。 我不確定為什么會發生這種情況,我嘗試使用 contains 來檢查集合中是否已經存在可以正常工作的相同元素。 調用 reset 方法時拋出異常。

java.lang.NullPointerException
  at line 55, Leaderboard$1.compare
  at line 52, Leaderboard$1.compare
  at line 374, java.base/java.util.TreeMap.getEntryUsingComparator
  at line 343, java.base/java.util.TreeMap.getEntry
  at line 601, java.base/java.util.TreeMap.remove
  at line 276, java.base/java.util.TreeSet.remove
  at line 86, Leaderboard.reset
  at line 71, __Driver__.__helperSelectMethod__
  at line 91, __Driver__.__helper__
  at line 112, __Driver__.main

這是我的代碼:

class Leaderboard {
    TreeSet<Integer> TS;
    HashMap<Integer, Integer> HS = new HashMap<>();
    public Leaderboard() {
        TS = new TreeSet<>(new Comparator<Integer>(){
           @Override
            public int compare(Integer a, Integer b){
                if(HS.get(a).equals(HS.get(b))){
                    return Integer.compare(a, b);
                }
                return HS.get(a).compareTo(HS.get(b));
            }
        });
    }
    
    public void addScore(int playerId, int score) {
        HS.put(playerId, HS.getOrDefault(playerId, 0) + score);
        TS.add(playerId);
        TreeSet<Integer> test = TS;
        HashMap<Integer, Integer> test2 = HS;
    }
    
    public int top(int K) {
        Iterator<Integer> iterator = TS.iterator();

        int res = 0;
        while(K > 0 && iterator.hasNext()){
            res += HS.get(iterator.next());
            K--;
        }
        return res;
    }
    
    public void reset(int playerId) {
        Integer id = new Integer(playerId); //tried, not work
        System.out.println(HS.containsKey(id)); // true        
        System.out.println(TS.contains(id)); // true
        HS.remove(id);
        TS.remove(id);
    }
}

/**
 * Your Leaderboard object will be instantiated and called as such:
 * Leaderboard obj = new Leaderboard();
 * obj.addScore(playerId,score);
 * int param_2 = obj.top(K);
 * obj.reset(playerId);
 */

正如@VGR 提到的:您確定 HS.get(a) 在您的比較方法中永遠不會返回 null 嗎?

這是因為 TreeMap 是基於 HashMap 來比較的。 如果使用 HS.remove(a) 刪除 HS 值,則無論何時 treemap 調用 HS.get(a) 都會有一個 null 作為返回值。 當為 HS.get(a).compareTo 調用 compare 時,它​​將是 null.compareTo,這就是拋出 NullPointerException 的原因。

暫無
暫無

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

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