HashSet
の2つのセットは、比較のために並べ替えてTreeSet
に変換されています。 HashSet
をTreeSet
に変換した後。私はこれらの2つのTreeSetを 'equals'関数を使って比較すると、それらは異なっていると言います。私はそれをデバッグしますが、同じ内容の同じ注文を表示します。私は何が間違っているのか理解できませんか?は、同等性についてツリーセットを比較します
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)
この条件を試してみました。しかし、同じ結果、Javaのコンパレータのドキュメントから"Unequal set of tree"
あなたが常に「1」と「-1」を返すので、あなたのcomperatorは平等を返すことはありません。 – SomeJavaGuy
'私は、TreeSetに変換して2つのHashSetを用意して、比較を簡単にするために並べ替えることができます。ほとんど意味がありません。 HashSetを正しく使用した場合(つまりequalsとhashCodeをオーバーライドする場合)、2つのHashSetを直接比較できます。 2つのセットを比較するときは、順序は関係ありません。 – Eran
@Eran 'HashSet'はプロトタイプに過ぎません。なぜなら、私が取得するオブジェクトの集合はより一般的なものであるか、 '比較'機能は' set'からの任意の型の実装とは独立しているべきであるからです。あなたが 'TreeSet 'に変換するよりも良い方法を知っていれば。私はそれを歓迎します。 – user3042916