为什么TreeSet在我推入三个对象时只能容纳一个对象?

时间:2012-02-20 15:03:10

标签: java java-ee treeset java-api

我想将一些对象推入TreeSet(在BigHeap类中),但我遇到了问题:

这是我的主要课程:

# --------- Print 3 -----------
Logger.info("items.size() = " + items.size()); 
for (Item item : items) {
  Long score = item.getScoreByQueryItems(queryItems);
  Long itemId = item.id;
  ItemCacheNode node = new ItemCacheNode(itemId,score);
  bigHeap.push(node);  <----- here is the push action ---------
  # --------------Print three times------------
  Logger.info("node.itemId = " + node.getItemId()); 
}
# ---------------Print 1----------
Logger.info("bigHeap.getTreeSet().size() = " + bigHeap.getTreeSet().size()); 

这是我的BigHeap.java:

public class BigHeap<T> {
 private TreeSet<T> treeSet;
 public BigHeap(Comparator<T> comparator){
   this.treeSet = new TreeSet<T>(comparator);
 }
 public void push(T o){
   treeSet.add(o);
 }
 public TreeSet<T> getTreeSet(){
   return this.treeSet;
 }
}

问题是,为什么bigHeap会推三次(不同的对象),但毕竟只持有一个对象。

1 个答案:

答案 0 :(得分:0)

这可能是因为Set不允许重复元素的原因。

您正在将ItemCacheNode类型的对象推送到名为bigHeap的set ADT中。现在,根据docs

将新对象添加到集合中
  

元素按照它们的自然顺序排序,或者用   比较器在创建时设置,具体取决于哪个   使用构造函数。

错误的比较器会覆盖其他声音等于TreeSet 原生的方法iff 使用Set接口未正确实现Treeset。根据上述文件,

  

注意由一组维护的排序(无论是否显式   比较器提供)必须与equals一致,如果是的话   正确实现Set接口。 (参见可比较者或比较者   对于与equals一致的精确定义。)就是这样   因为Set接口是根据equals操作定义的,   但是TreeSet实例使用它执行所有元素比较   compareTo(或compare)方法,因此两个被认为相等的元素   从该集合的角度来看,通过这种方法是相等的。该   集合的行为即使其排序不一致也是明确定义的   与...平等它只是没有遵守集合的一般合同   接口

你的定义,

private TreeSet<T> treeSet = new TreeSet<T>(comparator);

忽略了界面的使用,因此,通过不遵守Set的非重复功能的一般概念,显示了这种错误的功能。