[英]Is it better to use a TreeSet or ArrayList when using a custom comparator
[英]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.