我有一个基于TreeSet的队列实现,我使用TreeSet作为项目的顺序频繁更改。
不幸的是,我遇到了一些问题。我的队列类实现了next(),contains()和remove()方法(包装TreeSet remove()和contains()以及一个返回第一个项但不删除它的基本迭代器。)
我有一个自定义比较器,用于对树进行排序(下图)。如果我在同步块(线程安全)中执行queue.remove(queue.next())
,则队列长度不会更改。
如果我queue.contains(queue.next())
,则返回false。
这怎么可能?队列中的项覆盖了equals和hashcode方法,但据我所知,TreeSet不会使用它们。
下面的t1.getName()
总是返回一个唯一的字符串(我100%肯定这一点)。
private class BayesianComparator implements Comparator<SolverRunnable>{
@Override
public int compare(SolverRunnable t, SolverRunnable t1) {
int s = score(t1) - score(t);
if(s == 0){
return t1.getName().compareTo(t.getName());
}
return s;
}
public int score(SolverRunnable t){
double score = 0;
for(Node n : t.getModifiers().keySet()){
Double d = variableTrueProbs.get(n);
if(d != null){
if(t.getModifiers().get(n) == '1'){
score += (d - 0.5);
}
else{
score -= (d - 0.5);
}
}
}
return (int)Math.round(score * 1000);
}
}