0

Personキーボードから入力した人の名前と姓を保持するクラスを(本にあるように)作成しました。次にPhoneNumber、国コード、市外局番、および人の番号を文字列としてカプセル化する別のクラスがあります。
Personは、ハッシュマップのキーとして使用されることを目的としています。
クラスはとの両方をBookEntryカプセル化します。多くのオブジェクトが、電話帳を表すHashMapを構成しています。PersonPhoneNumberBookEntry

PersonComparable<Person>メソッドを含むように実装しますCompareTo(Person)。後で本はequals(Object anotherPerson)方法を追加します。
私の質問は、CompareTo2つのキーを比較するのに十分な方法ではないかということです。それとも、HashMap <>の内部メカニズムでは、equals()2つのキーを比較するためのメソッドを含める必要がありますか?
compareTo()

public int compareTo(Person person) {
    int result = lastName.compareTo(person.lastName);
    return result==0? firstName.compareTo(person.firstName):result;
}

equals()

public boolean equals(Object anotherPerson){
    return compareTo((Person)person)==0;
}
4

3 に答える 3

2

一部のデータ構造はcompareTo(たとえば a TreeMap) を使用し、一部はequals(たとえば a HashMap) を使用します。

さらに重要なことは、 javadocで説明されているように、一貫性を保つことcompareToを強くお勧めします。equalsComparator

(x.compareTo(y)==0) == (x.equals(y)) にすることを強くお勧めしますが、厳密には必須ではありません。一般的に言えば、 Comparable インターフェースを実装し、この条件に違反するクラスは、この事実を明確に示す必要があります。推奨される言語は、「注: このクラスには、equals と矛盾する自然な順序付けがあります。」

TreeMapjavadocにある別のヒント(強調は私のもの):

このソートされたマップが Map インタフェースを正しく実装するためには、ソートされたマップと同様に、明示的なコンパレータが提供されているかどうかにかかわらず、ツリー マップによって維持される順序が equals と一致している必要があることに注意してください。

最後に、オーバーライドする場合は、ハッシュベースの構造を使用するときに予期しない動作を防ぐためにequalsもオーバーライドする必要があります。hashcode

于 2012-06-06T11:10:10.857 に答える
1

HashMapを使用するequals()のではなくcompareTo()、を使用するため、実装する必要があります。 TreeMapを使用しcompareTo()ます。

于 2012-06-06T11:17:34.297 に答える