我遇到了TreeSet的contains()方法的问题。据我了解,contains()应该调用所包含的对象的equals(),如javadoc所说:
boolean java.util.TreeSet.contains(Object o):如果此set返回true 包含指定的元素。更正式的,如果和,则返回true 只有当这个集合包含一个元素e时(o == null?e == null: o.equals(E))。
我尝试做什么:
我有一个包含成员String baseword
的结果对象的树集列表。现在我想将每个TreeSet与所有其他TreeSet进行比较,并为每个对创建一个他们共享的基本列表。为此,我迭代列表一次treeSet1
,第二次迭代treeSet2
,然后迭代treeSet2
中的所有ResultObjects并运行treeSet1.contains(ResultObject)
每个,查看treeSet1
是否包含带有此wordbase的结果对象。我调整了ResultObject的compareTo
和equals
方法。但似乎我的equals
从未被调用过。
任何人都可以解释为什么这不起作用吗?
问候, 丹尼尔
public static void getIntersection(ArrayList<TreeSet<Result>> list, int value){
for (TreeSet<Result> treeSet : list){
//for each treeSet, we iterate again through the list of TreeSet, starting at the TreeSet that is next
//to the one we got in the outer loop
for (TreeSet<Result> treeSet2 : list.subList((list.indexOf(treeSet))+1, list.size())){
//so at this point, we got 2 different TreeSets
HashSet<String> intersection = new HashSet<String>();
for (Result result : treeSet){
//we iterate over each result in the first treeSet and see if the wordbase exists also in the second one
//!!!
if (treeSet2.contains(result)){
intersection.add(result.wordbase);
}
}
if (!intersection.isEmpty()){
intersections.add(intersection);
}
}
}
public class Result implements Comparable<Result>{
public Result(String wordbase, double result[]){
this.result = result;
this.wordbase = wordbase;
}
public String wordbase;
public double[] result;
public int compareTo(DifferenceAnalysisResult o) {
if (o == null) return 0;
return this.wordbase.compareTo(o.wordbase);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((wordbase == null) ? 0 : wordbase.hashCode());
return result;
}
//never called
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DifferenceAnalysisResult other = (DifferenceAnalysisResult) obj;
if (wordbase == null) {
if (other.wordbase != null)
return false;
} else if (!wordbase.equals(other.wordbase))
return false;
return true;
}
}
答案 0 :(得分:9)
据我了解,contains()应调用包含的对象的equals()
不是TreeSet
,不是。它调用compare
:
基于TreeMap的NavigableSet实现。 元素按照自然顺序排序,或者按照创建时间提供的比较器进行排序,具体取决于使用的构造函数。
...
请注意,如果要正确实现Set接口,则由一个集合维护的排序(无论是否提供显式比较器)必须与equals 一致。
您的compareTo
方法目前与equals
一致 - x.compareTo(null)
返回0,而x.equals(null)
则返回false。也许你对此感到满意,但是你不应该期待equals
被召唤。