TreeSet.contains()不会调用覆盖的equals

时间:2014-08-08 07:50:34

标签: java treeset

我遇到了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的compareToequals方法。但似乎我的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;
    }   
}

1 个答案:

答案 0 :(得分:9)

  

据我了解,contains()应调用包含的对象的equals()

不是TreeSet,不是。它调用compare

  

基于TreeMap的NavigableSet实现。 元素按照自然顺序排序,或者按照创建时间提供的比较器进行排序,具体取决于使用的构造函数。

     

...

     

请注意,如果要正确实现Set接口,则由一个集合维护的排序(无论是否提供显式比较器)必须与equals 一致。

您的compareTo方法目前与equals一致 - x.compareTo(null)返回0,而x.equals(null)则返回false。也许你对此感到满意,但是你不应该期待equals被召唤。