0

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

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

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

集合使用该equals()方法来确定元素是否已经在集合中。换句话说,如果您只使用正常插入,插入到集合中的第一个将是您被卡住的那个。

我认为您不能覆盖此行为(除非您实现自己的 set 类,在其中更改 add 方法以测试相等性进行 Y 比较)。

于 2013-03-05T12:33:03.487 回答
0

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

由于该行为很容易通过对列表进行排序和循环来实现,所以我会使用它。您不会通过使用 a 在实现时间或可维护性方面获得任何好处Set(可以说您正在使您的代码更难阅读),因此它确实是一个更好的选择。

于 2013-03-05T12:37:56.587 回答