1

Artifacts と呼ばれるオブジェクトの TreeSet があります。次のように、オブジェクトの equals および hash コード メソッドをオーバーライドしました。

 @Override
public int hashCode() {
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
        // if deriving: appendSuper(super.hashCode()).
        append(artifactId).
        toHashCode();
}

@Override
public boolean equals(Object arg0) {

    Artifact obj=(Artifact)arg0;

    if(this.getArtifactId().equalsIgnoreCase(obj.getArtifactId()))
    {

            return true;
    }

   return false;
}

equals メソッドにプリントを入れましたが、呼び出されません。次のようなコンパレータで TreeSet をインスタンス化しました。

 TreeSet<Artifact> syncedList = new TreeSet<Artifact>(new ArtifactComparator());

TreeSet は equals オーバーライドに基づいて一意性を確立することを読みました。

TreeSet に同じ ArtifactId を持つ複数のオブジェクトが表示されますが、これは必要なほど一意ではありません。

equals および hash コードのメソッドに何か欠けているものはありますか?

4

2 に答える 2

2

アーネストが言ったように、方法が必要ですcompareTo()。ツリー構造について考えると、2 つのオブジェクトが互いに等しいと見なされるかどうかだけでなく、一方が「より小さい」か「より大きい」かを知る必要があるのは、ツリー内のどこにオブジェクトを相対的に配置するかを知るためです。すでにそこにあるもの。つまり、ツリーは順序付きリストを構築します。

したがって、必要に応じてクラスを廃止し、以下のようなメソッドを追加しArtifactComparatorて Artifact クラスを implementにすることができます。Comparable<Object>compareTo

 @Override
 public int compareTo(Object arg0) {
     Artifact obj=(Artifact)arg0;
     return this.getArtifactId().compareToIgnoreCase(obj.getArtifactId());
 }
于 2012-05-18T02:23:23.270 に答える
1

TreeMap(および this ) は、またはを取得する場合を除いて、メソッドをまったくTreeSet使用しません。問題がある場合は、2 つの s が等しいことを示すために、そのクラスの戻り値が必要です。equals()entrySet()keySet()ArtifactComparator.compareTo()0Artifact

于 2012-05-18T01:15:09.200 に答える