0

クラス ClassA の場合、私は2つの属性を持っています - X と Y 属性Xをチェックすることで2つのクラスの同等性が見つかるように、 ClassA の equals メソッドをオーバーライドしました。

ClassA {

Integer X,Y;

Integer getX(){return X;}
Integer getY(){return Y;}

boolean equals(object o){
      return getX().equals((ClassA)o).getX());
}

}

List から ClassA のすべての重複要素を削除したいのですが、2 つの要素が重複している場合は、Y 基準に基づいて重複要素を削除するロジックを追加したいと考えています。基本的には以下のようになります

if(A.eqauls(B)){
  remove A , if A.getY() > B.getY()
  ore remove B , if A.getY() < B.getY()
}

明らかに、リストを並べ替えて隣接する重複要素を確認し、ロジックに基づいて重複を削除しようとします。セットを使ってこれを行うことができるのだろうか。

4

3 に答える 3

1

このようなもの:

Map<ClassA, ClassA> map = new HashMap();

for(ClassA elem : yourList)
{
   ClassA existing = map.get(elem);
   if(existing != null)
   {
      if(check your condition using "elem" and "existing" and getY)
      {
        continue;// don't replace the element in the map.
      }
   }
   map.put(elem, elem);
}
//map.values() will have your elements

LinkedHashMapリストのように要素の順序を維持したい場合は、代わりに使用することもできます。

ところで、HashSet は同様の方法で HashMap を使用して実装されます。

于 2013-03-05T12:44:22.540 に答える
0

の一般的な契約を破ることなくこれを行うことはできません。これはSet、が (メソッドに従って) 既にセット内の要素add()と等しい場合、要素を追加しないことを示しています。equals()明らかに、この動作を実装する場合は aを使用できます (特定の値を持つ要素が既に表示されているかどうかを確認できます)。ただし、 Aの方が少し良い選択です。SetXMap

この動作は、リストを並べ替えてループすることで実装するのが非常に簡単なので、それを使用します。を使用しても、実装時間や保守性が向上するわけではありSetません (おそらく、コードが読みにくくなっています)。

于 2013-03-05T12:37:56.587 に答える
0

セットは、equals()メソッドを使用して、要素が既にセット内にあるかどうかを判断します。つまり、セットに最初に挿入されたものは、通常の挿入を使用した場合に行き詰まったものになります。

この動作をオーバーライドできるとは思いません (add メソッドを変更して等価性をテストし、Y 比較も行う独自の set クラスを実装しない限り)

于 2013-03-05T12:33:03.487 に答える