比较treeset的相等性

时间:2016-09-07 12:37:42

标签: java collections treeset

我有两组HashSet我转换为TreeSet进行排序以便于比较。将HashSet转换为TreeSet后。当我使用' equals'来比较这两个TreeSet时功能,它说它们是不同的。我调试它,但它显示相同的内容和相同的顺序。我无法理解什么是错的?

   public class TestProductBundle {
    @SuppressWarnings("unused")
    public static void main(String args[]) {

        // HashSet
        Set<ClassA> hashSetA = new HashSet<ClassA>() {
            {
                add(new ClassA("name", 1, "desc"));
                add(new ClassA("name", 2, "desc"));
                add(new ClassA("name", 3, "desc"));
            }
        };

        Set<ClassA> hashSetB = new HashSet<ClassA>() {
            {
                add(new ClassA("name", 1, "desc"));
                add(new ClassA("name", 2, "desc"));
                add(new ClassA("name", 3, "desc"));
            }
        };

        TreeSet<ClassA> treeSetA = new TreeSet<ClassA>(new CompareID()) {
            {
                addAll(hashSetA);
            }
        };

        TreeSet<ClassA> treeSetB = new TreeSet<ClassA>(new CompareID()) {
            {
                addAll(hashSetB);
            }
        };

        if (treeSetA.equals(treeSetB))
            System.out.println("Equal set of tree");
        else
            System.out.println("Unequal set of tree");   // this is result.
    }}

ClassA给出如下:

class ClassA {
String name;
int id;
String desc;

public ClassA(String name, int id, String desc) {
    this.name = name;
    this.id = id;
    this.desc = desc;
}

    int getId() {
        return id;
    }
}

class CompareID implements Comparator<ClassA> {
    @Override
    public int compare(ClassA o1, ClassA o2) {
        if (o1.getId() > o2.getId())
            return 1;
        else
            return -1;
    }
}

编辑: 我也试过if (treeSetA.containsAll(treeSetB) && treeSetB.containsAll(treeSetA)这个条件。但结果相同,"Unequal set of tree"

3 个答案:

答案 0 :(得分:3)

您的compare方法总是会返回不平等。

来自doc:

  

[...]

     

负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

     

[..]

public int compare(ClassA o1, ClassA o2) {
    if (o1.getId() > o2.getId())
        return 1;
    else if(o2.getId() > o1.getId())
        return -1;
    // 0  indicates equality.
    else return 0;
}

将此结果包含在输出

Equal set of tree

答案 1 :(得分:1)

这里真正的教训是:学习您正在实施的界面。不要只是放下一些使编译器满意的代码。

当你@Override比较函数时,你必须理解意味着什么。所以,你研究了javadoc。这清楚地告诉你,比较应该返回&lt; 0,0,&gt; 0。

这三个值中的一个。而且不只是两个

答案 2 :(得分:0)

来自Java Comparator文档:

  

当且仅当c.compare(e1,e2)== 0具有与e1.equals(e2)相同的布尔值时,比较器c对一组元素S施加的排序被认为与equals一致。对于S中的每个e1和e2。

     

使用能够比较的比较器时应该小心   强加与equals不一致的排序以排序有序集   (或排序的地图)。假设一个带有显式的有序集(或有序映射)   比较器c与从集合S中绘制的元素(或键)一起使用   c对S施加的排序与equals,排序后的顺序不一致   设置(或排序的地图)将表现得很奇怪。&#34;特别是排序   set(或有序映射)将违反set的一般合同(或   map),用等号定义。

你的比较器从不迎合同等物体。此外,ClassA不会覆盖equals