当明确包含item时,TreeSet包含返回false

时间:2015-01-22 15:28:54

标签: java tree sorted

我有一个基于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);
}
}

0 个答案:

没有答案