2016-12-04 6 views
0

独自のオブジェクトをTreeMapに保存する際に考慮する必要があるかどうかは疑問でした。ハッシュマップにキーとして独自のオブジェクトを保存すると、似たようなものがあります。後でハッシュマップを取得できるように、equalsメソッドとhashcodeメソッドをオーバーライドする必要があります。トリマップにはハッシュはなく、黒い赤のアルゴリズムが使われていますが、特別なことがあるかどうかはわかりません。 もしそうなら、アカウントに何かがあるかどうか教えていただけますか?独自のオブジェクトをTreeMapのキーとして保存する

おかげ

+0

あなたがすでに作成した時点で、ツリーを構築/操作するときに要素を比較する必要があるときに使用できるカスタムコンパレータを指定するオプションがあります。 –

答えて

3

javadocは言う:

マップがそのキーの自然順序付けに従ってソートされた、または

だから、あなたが必要とするマップ作成時に提供されるComparatorによってれます自然順序付けを正しく実装したり、コンパレータを正しく実装したりすることができます。

また、言う:

(注)このソートマップがにある場合は、ツリーマップによって維持順序は、任意のソートマップと同じように、明示的なコンパレータが提供されているかどうか、equalsと一致していなければならないということMapインタフェースを正しく実装してください。これは、Mapインターフェースがequals操作で定義されているが、ソートされたマップはcompareTo(またはcompare)メソッドを使用してすべてのキー比較を実行するため、2つのこのメソッドで等しいとみなされるキーは、ソートされたマップの観点からは等しいです。ソートされたマップの動作は、その順序付けがequalsと矛盾していても明確に定義されています。 Mapインターフェイスの汎用規約に従わないだけです。

Mapの一般規約に従いたい場合、compareTo()メソッドはequals()と一貫していなければなりません。つまり、equals()を正しく実装する必要があります。 )メソッド、および推移的にhashCode()メソッドを使用し、a.equals(b) iff e.compareTo(b) == 0を確認する必要があります。

大抵の場合、2つのオブジェクトに対して0を返すcompareTo/compareメソッドを実装しているため、これらの2つのオブジェクトがマップによって異なるとみなされるため、

0

equalscompareToとは別として、もう1つのことが非常に重要です。

  • あなたの鍵は、あるいは少なくともあなたは比較のために使用しているフィールドは、不変でなければなりません。

そして、あなたがコンストラクタでカスタムコンパレータを提供している限り、実際には何かをTreeMapのキーとして使うことができます。

関連する問題