对于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()
}
显然,我会尝试对列表进行排序并查看相邻的重复元素,然后根据我们的逻辑删除副本。 我想知道我是否可以使用套装来做到这一点。
答案 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}}(可能会让您的代码更难以阅读),您无法在实现时间和可维护性方面获得任何收益,因此它确实是更好的选择。