我想将一些对象推入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会推三次(不同的对象),但毕竟只持有一个对象。
答案 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
的非重复功能的一般概念,显示了这种错误的功能。