gpt4 book ai didi

java - 从 TreeSet 中删除元素时出现问题

转载 作者:行者123 更新时间:2023-12-01 07:15:59 30 4
gpt4 key购买 nike

我正在做以下事情

class RuleObject implements Comparable{



@Override
public String toString() {
return "RuleObject [colIndex=" + colIndex + ", probability="
+ probability + ", rowIndex=" + rowIndex + ", rule=" + rule
+ "]";
}
String rule;
double probability;
int rowIndex;

int colIndex;

public RuleObject(String rule, double probability) {
this.rule = rule;
this.probability = probability;
}
@Override
public int compareTo(Object o) {

RuleObject ruleObj = (RuleObject)o;
System.out.println(ruleObj);
System.out.println("---------------");
System.out.println(this);
if(ruleObj.probability > probability)
return 1;
else if(ruleObj.probability < probability)
return -1;
else{
if(ruleObj.colIndex == this.colIndex && ruleObj.rowIndex == this.rowIndex && ruleObj.probability == this.probability && ruleObj.rule.equals(this.rule))
return 0;
}
return 1;

}


}

我有一个包含 RuleObject 元素的 TreeSet。我正在尝试执行以下操作:

System.out.println(sortedHeap.size());
RuleObject ruleObj = sortedHeap.first();
sortedHeap.remove(ruleObj);
System.out.println(sortedHeap.size());

我可以看到集合的大小保持不变。我无法理解为什么它不被删除。另外,在删除时我可以看到调用了compareTo 方法。但它只被调用了 3 个对象,而 set 中有 8 个对象。谢谢

最佳答案

查看 remove 的规范:

Removes the specified element from this set if it is present. More formally, removes an element e such that (o==null ? e==null : o.equals(e)), if this set contains such an element.

您的问题是 RuleObject@Override equals(Object other)。您需要这样做,当然,您还需要@Override hashCode()

<小时/>

此外,compareTo 被调用的次数少于元素数量的原因是因为它应该是一个 O(log N) 操作;这就是使用 TreeSet 的全部目的。如果您有 1024 个元素,则 compareTo 的调用次数预计不会超过 10 次。

<小时/>

正如弗拉德指出的那样,你的比较器坏了。具体来说,最后一个语句 return 1; 破坏了它。您应该根据其他字段扩展相等的概率情况以返回 -1、0、+1。

关于java - 从 TreeSet 中删除元素时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485637/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com