我有两组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"
答案 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
。