2013-03-05 55 views
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()); 
} 

} 

现在我想从列表中删除ClassA的所有重复元素 但是,如果发现2个元素重复,我想添加一个逻辑删除基于Y条件的重复元素。 所以基本上它会像下面

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

很显然,我会尝试对列表进行排序,看看周边重复的元素,然后除去基于我们的逻辑重复。 我不知道我是否可以使用集合来做到这一点。

回答

0

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

我不认为你可以重写这种行为(除非你实现你自己的集合类,你改变add方法来测试相等性做我们的Y比较)。

0

如果不打破Set的总体合同,即add()将永远不会添加元素(根据equals()方法)将不会添加到该集合中已有的元素。显然,如果你正在实现这种行为,你可以使用 a Set(你可以检查你是否已经看到一个具有特定值X的元素)。 A Map将是一个稍微好一点的选择。

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

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实现的。