2016-09-07 15 views
1

HashSetの2つのセットは、比較のために並べ替えてTreeSetに変換されています。 HashSetTreeSetに変換した後。私はこれらの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」と「-1」を返すので、あなたのcomperatorは平等を返すことはありません。 – SomeJavaGuy

+1

'私は、TreeSetに変換して2つのHashSetを用意して、比較を簡単にするために並べ替えることができます。ほとんど意味がありません。 HashSetを正しく使用した場合(つまりequalsとhashCodeをオーバーライドする場合)、2つのHashSetを直接比較できます。 2つのセットを比較するときは、順序は関係ありません。 – Eran

+0

@Eran 'HashSet'はプロトタイプに過ぎません。なぜなら、私が取得するオブジェクトの集合はより一般的なものであるか、 '比較'機能は' set'からの任意の型の実装とは独立しているべきであるからです。あなたが 'TreeSet 'に変換するよりも良い方法を知っていれば。私はそれを歓迎します。 – user3042916

答えて

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 
0

Sは、唯一c.compare(E1の場合ならばequalsと一貫性があると言われている要素のセットにコンパレータCによって課される順序、 e2)== 0は、S内のすべてのe1およびe2に対してe1.equals(e2)と同じブール値を持ちます。 可能なコンパレータを使用する場合は、equalsと矛盾する順序を適用して並べ替え順序を決定するときに注意してください (またはソートされた地図)を設定します。明示的な コンパレータcを持つソートされた集合(またはソートされたマップ)が、集合Sから引き出された要素(またはキー)で使用されているとします。 Sのcによって課せられた順序がequalsと矛盾する場合、ソートされた 集合マップ)は「不思議なことに」動作します。特にソートされた セット(またはソートされたマップ)は、set(または マップ)の一般契約に違反します。これは、equalsで定義されています。

コンパレータは、等しいオブジェクトを決して満たすことはありません。また、ClassAはequalsを上書きしません。

1

実際のレッスンで、その結果:研究あなたが実装されるインターフェイス。コンパイラを幸せにするいくつかのコードを置かないでください。

を理解するあなたが@比較機能をオーバーライドしたときの意味。したがって、あなたはそのためにjavadocを調べます。そして、それは明らかに、compareが<,0,0> 0を返すべきだとあなたに伝えます。

これら3つの値のいずれか。そして、ただ2つ

+0

アドバイスありがとうございます!私はそれに従う。 – user3042916

+0

ようこそ。 – GhostCat

関連する問題