0

私は1つのクラスHumanを持っています。これには、 age(int)name(String)の2つのフィールドが含まれています。Eclipseを使用して、hashCode()メソッドとequals()メソッドをこれらの2つのフィールドでオーバーライドします。また、年齢フィールドに基づいてコンパレータを作成します。

ここで、 Comparator of ageとHumanクラスの2つのインスタンス(異なるフィールド値を持つ)を使用してTreeSetオブジェクトを作成します。次に、これら2つのオブジェクトをセットに追加しますが、セットには常に1つのオブジェクトしかありません。

問題を理解するために、これら2つのオブジェクトのハッシュ値を出力しましたが、それらが異なっていることがわかりました。次に、 equals()メソッドをテストします。フィールド値が異なる2つのインスタンスを比較すると、falseが出力されます。そのため、TreeSetが問題を処理(区別)できない理由がわかりません。誰か助けてもらえますか?どうもありがとう !

4

2 に答える 2

4

hashCode()TreeSetはを使用しませんequals()。引数として渡したコンパレータ(または、compareTo()オブジェクトがComparableであり、コンパレータを提供していない場合はオブジェクトのメソッド)を使用します。2つのオブジェクトを比較するときにcompare()(または)が0を返す場合、TreeSetは2つのオブジェクトを等しいと見なします。compareTo()

したがって、コンパレータが人間の年齢のみを比較する場合、同じ年齢のすべての人間は等しいと見なされます。同じ年齢と名前の人間を同等と見なしたい場合、コンパレータは年齢で比較し、年齢の比較で0が返された場合は名前で比較する必要があります。

于 2012-07-12T14:08:06.957 に答える
2

ドキュメントから

これは、Setインターフェイスがequals操作で定義されているが、TreeSetインスタンスがcompareTo(またはcompare)メソッドを使用してすべての要素の比較を実行するためです。したがって、このメソッドで等しいと見なされる2つの要素は、セット、等しい。セットの動作は、その順序がequalsと矛盾している場合でも明確に定義されています。Setインターフェースの一般的な契約に従わないだけです。

于 2012-07-12T14:08:24.247 に答える