2016-06-20 4 views
4

Java Object Orderingチュートリアルを見ると、記事の最後のセクション'Comparators'がちょっと混乱しました。ソートされたコレクションのJavaオブジェクトの注文

従業員の名前に匹敵するクラスEmployeeを定義することにより、このクラスがequalsメソッドをオーバーライドしているかどうかを示すチュートリアルは表示されません。それから、カスタマイズしたComparatorを使用して、従業員が年配者によってソートされ、従業員のリストをソートして理解できるようにします。

次に、このようなTreeSetとして分別回収のために動作しませんなぜチュートリアルでは、(SortedSet)について説明し、その理由は次のとおりです。

それがイコールとは互換性がありません発注を生成します。つまり、このComparatorは、equalsメソッドではないオブジェクトと同じです。特に、同じ日に雇用された2名の従業員は、同等の人と比較されます。リストをソートするときは、これは問題ではありません。 Comparatorを使用してソートされたコレクションを注文すると、それは致命的です。このComparatorを使用して、同じ日付に雇われた複数の従業員をTreeSetに挿入すると、最初のものだけがセットに追加されます。 2番目の要素は重複要素として認識され、無視されます。

私はSetequals法に基づいていないながらList要素が重複することができます知っているので、今私は、困惑しています。だから、Comparatorによって生成された順序がequalsと互換性がないというチュートリアルがいつ出てくるのだろうか、それはどういう意味ですか?また、「このComparatorを使用して、同じ日付に雇われた複数の従業員をTreeSetに挿入すると、最初のものだけがセットに追加されます。 2番目の要素は重複要素として認識され、無視されます。私はどのようにComparatorを使用して元のequalsメソッドの使用に影響を与えるか分からない。私は私の質問は、TreeSetがこの場合、そしてcompareequalsの方法が使用されるときに、どのように生成されソートされるのかと考えています。 TreeSet

答えて

3

このチュートリアルでは、Comparatorで生成された順序がequalsと互換性がないと言っているのですが、それはどういう意味ですか?

この例では、Comparatorは、優先度だけに基づいて2つのオブジェクトを比較します。この比較は、決してequalsまたはhashCodeを使用しません。このことを念頭に置いて、ComparatorTreeSetに渡すと、Comparatorの0の結果はすべて等しいとみなされます。したがって、Employeeが開始日を共有している場合、そのセットが等しいと思うので、1つだけが追加されます。最後に

は:

は、私は私の質問は、TreeSetのが生産され、この場合にソートと比較し、等しいときの方法が使用されていることになるかと思います。 TreeSetについては

Comparatorが指定されている場合、それは、オブジェクトの平等と順序を決定するためにcompareメソッドを使用しています。 Comparatorが指定されていない場合、セットは並べ替え対象のオブジェクトのcompareToメソッドを使用します(Comparableを実装する必要があります)。 Set仕様がequalsを利用するためのJava仕様が使用されているcompare/compareTo方法はequalsに沿ったものでなければならないことを主張する理由

理由はSetのこの特定のタイプ、TreeSetは、代わりに、比較を使用してもかかわらず、です。

あなたは、いくつかのメソッドの実装からSetを受け取った場合、あなたはequals法で定義されるように、そのSet内のオブジェクトの重複しないことを期待することができます。ただし、TreeSetはこのメソッドを使用しないため、開発者は、比較メソッドがequalsと同じ等価になるように注意する必要があります。

+0

ありがとう!そして、これは 'Set'インターフェースとの一貫性を保つことであり、' contains() 'のような' equals'メソッドを使うメソッドを見たことが分かりました。 –

2

は二つの要素が「等しい」であるかどうかを決定するためにのみコンパレータを使用して:

https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

注その(明示的なコンパレータが提供されるか否か)をセットすることによって維持発注しなければなりませんSetインタフェースを正しく実装するには、equalsと一貫している必要があります。これは、Setインタフェースがequals操作で定義されているためですが、TreeSetインスタンスはcompareTo(またはcompare)メソッドを使用してすべての要素の比較を実行するため、2つのこのメソッドによって等しいとみなされる要素は、セットの観点から見ると等しいです。 セットの動作は、順序がequalsと矛盾していても明確に定義されています。 Setインタフェースの汎用規約に従わないだけです。

これは場合にのみ真equals返した場合、コンパレータはHashSetのように、TreeSetのと他のセットの間で一貫性のある動作を取得するには、0を返す必要があることを意味します。 HashSetは実際にequalsとハッシュコードを使用して、2つの要素が「等しい」かどうかを判断します。

+0

ジルコンが精緻化するまで私はあなたの答えを得られませんでした。それでも、ありがとうございました。 –

関連する問題