2009-09-04 6 views
3

私は、コンパイラが書き込まれたTreeSetを使用しました。今、TreeSetに要素を追加するときにComparatorのcompareメソッドが0を返すと、TreeSetには等しいランクのオブジェクトが1つしかないようです。TreeSet Comperator

この動作はjavadocsに記載されていません。たぶん私は何かが恋しいです。この現象を確認できますか?

私はコンパレータを編集しました。今度は0を返すことはなく、TreeSetには等しいランクのすべてのオブジェクトが含まれています。

複数のオブジェクトを同じランクにしたい場合は、その方法が必要ですか?

+0

あなたの研究、論理、現在の結果、予想される結果を追加して、コミュニティが正確な問題を知り、問題を解決しようとしてください。 –

答えて

7

これは、同じオブジェクトを一度しか含まないものとして定義されているため、そうでなければならない方法です。

コンパレータが0を返すと、2つのオブジェクトが等しいとみなされるため、すべての等しいオブジェクトのうちの1つ(おそらく最初のもの)のみがセットに含まれます。

6

はい、これはJavaDoc for TreeSetに記載されている:それは にある場合 セットによって維持順序が(明示 コンパレータが提供されているか否か) equalsと一致しなければならないこと

Setインターフェイスを正しく実装してください。 ( equalsと矛盾の 正確な定義のためにComparable又はComparatorを参照。)Set インタフェースは、 equals操作に関して定義しかしTreeSet インスタンスがcompareToを使用して、すべての要素を 比較を行うため、これがそうです(または compare)メソッドであるため、 という2つの要素は、この方法で等しいとみなされます。 はセットの観点からは等しいです。 セットの動作は、順序が矛盾していても、 とよく定義されています。 とequals;それはちょうどインターフェイスの 一般契約に従わない。 (重点鉱山)

1

あなたが互いに等しい複数のオブジェクトを保持することができ、分別収集をしたい場合、GoogleのコレクションからTreeMultisetは、おそらくトリックを行うだろう。

関連する問題