在任何Collection中检测和删除重复项的最有效方法是什么?我使用以下方法:
static class Link{
Link(Link next1,Object val1){
next = next1;
val = val1;
}
Link next;
Object val;
}
public static void removeDuplicates(Collection<?> collection){
Link link = null;
Iterator<?> itr = collection.iterator();
a: while(itr.hasNext()){//Iterate the parameter Collection or corrupted Set
Object obj = itr.next();
Link c = link;
while(c != null){
if(obj.equals(c.val)){
itr.remove();//Duplicate found!
continue a;
}
c = c.next;
}
link = new Link(link,obj);
}
}
是否有更快(或更好)的方法来删除重复项?
答案 0 :(得分:1)
如果更改基于散列的集合中的对象,以致违反了hashcode / equals,则未指定该集的行为。它当然不能保证&#34;设置为&#34;关于API的语义。因此,您的问题没有解决方案,即规范(即javadoc)将保证能够正常工作。
实际上,最可能工作的解决方案是迭代设置条目并将它们添加到新的(空)集合中。使用addAll
将是等效的。这(当然)非常昂贵。
但真正的解决方案是避免首先解决问题。如果你将可变对象放入依赖于稳定平等的集合中。 hashcodes OR稳定排序,然后在变异之前删除它们; e.g。
set.remove(e);
e.mutate();
set.add(e);