根据条件插入时从集中删除重复元素

时间:2013-03-05 12:20:33

标签: java set duplicates

对于ClassA类,我有2个属性 - X和Y. 我已经重写了ClassA的equals方法,以便通过检查属性X找到2类的相​​等性。

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()
}

显然,我会尝试对列表进行排序并查看相邻的重复元素,然后根据我们的逻辑删除副本。 我想知道我是否可以使用套装来做到这一点。

3 个答案:

答案 0 :(得分: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

BTW,HashSet以类似的方式使用HashMap实现。

答案 1 :(得分:0)

设置使用equals()方法确定元素是否已在集合中。换句话说,如果您只使用正常插入,插入到集合中的第一个将是您坚持使用的那个。

我认为你不能覆盖这种行为(除非你实现自己的set类,你在那里更改add方法以测试相等性也进行Y比较)。

答案 2 :(得分:0)

如果不违反Set的一般合同,就不能这样做,add()声明如果equals()相等(根据Set方法),X将永远不会添加元素已经在集合中的元素。显然,如果您正在实现此行为,则可以使用 Map(您可以检查是否已经看到具有特定Set值的元素)。 {{1}}虽然是一个更好的选择。

由于行为很容易通过对列表进行排序和循环来实现,我会使用它。通过使用{{1}}(可能会让您的代码更难以阅读),您无法在实现时间和可维护性方面获得任何收益,因此它确实是更好的选择。