检测和删除集合中重复项的最有效算法是什么?

时间:2017-03-31 12:01:49

标签: java collections

在任何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);
    }
}

是否有更快(或更好)的方法来删除重复项?

1 个答案:

答案 0 :(得分:1)

如果更改基于散列的集合中的对象,以致违反了hashcode / equals,则未指定该集的行为。它当然不能保证&#34;设置为&#34;关于API的语义。因此,您的问题没有解决方案,即规范(即javadoc)将保证能够正常工作。

实际上,最可能工作的解决方案是迭代设置条目并将它们添加到新的(空)集合中。使用addAll将是等效的。这(当然)非常昂贵。

但真正的解决方案是避免首先解决问题。如果你将可变对象放入依赖于稳定平等的集合中。 hashcodes OR稳定排序,然后在变异之前删除它们; e.g。

set.remove(e);
e.mutate();
set.add(e);