【发布时间】:2017-03-31 12:01:49
【问题描述】:
在任何集合中检测和删除重复项的最有效方法是什么?我使用以下方法:
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);
}
}
是否有更快(或更好)的方法来删除重复项?
【问题讨论】:
-
为什么要把可变对象放在一个集合中,然后操作它们的内容?你为什么要忽略警告不这样做?您要做什么,可能有比在损坏设备时不断检查您的设备更好的方法。
-
从集合中移除对象 -> 操作对象 -> 将对象添加到集合中
-
解决问题的最快方法是退后一步,看看你即将制造的烂摊子;然后重新考虑您的方法并找到更好的解决方案。其他任何事情都是进入混乱的快速路线。关键是:Set 在添加 新对象时决定事情。在已添加的对象上完全“重新计算”自身的想法绝对对于集合类(恕我直言)是“外星人”。
-
正如 Kayaman 已经说过的,如果
hashCode()和equals()可能会受到修改的影响。您遇到的问题只是其中的一个指标。 -
顺便说一句:“我使用 HashSet 来操作一组 mutalbe 对象” - 你如何使用一组来操作对象?我猜你的意思是你正在操纵那个集合in的对象,不是吗?如果是这样,您可以尝试构建一个新集合,即迭代集合,删除对象(或在循环结束时清除原始集合),操作它们并将它们添加到新集合中。这应该会自动处理重复项。
标签: java collections