【发布时间】:2019-05-14 14:52:22
【问题描述】:
我正在尝试从 Java 中的无序列表中删除重复元素(Cracking the Coding Interview 中的一个问题)。
我在同一个 List 对象上使用嵌套迭代器,但是当我删除一个项目时我得到一个 ConcurrentModificationException。这是我的代码:
Iterator<String> i = list.iterator();
String curr;
while (i.hasNext()) {
curr = i.next();
Iterator<String> j = list.iterator();
while (j.hasNext()) {
String runner = j.next();
if (curr == runner){
j.remove();
}
}
}
书中的解决方案使用了 LinkedListNode 对象,这使得只改变节点的指针成为可能,但是有没有办法只使用java.util.LinkedList 来解决这个问题?
编辑:挑战是在不使用临时缓冲区的情况下做到这一点,否则额外的列表就可以解决问题。
【问题讨论】:
-
我会将需要删除的节点添加到另一个列表中。使用两个迭代器遍历整个列表后,从主列表中删除也位于“要删除”列表中的项目。
-
这仍然使用另一个集合,但是当您迭代列表时,您可以将元素添加到
Set。如果Set.add方法返回 false,则从列表中删除该元素。这样做意味着您不必多次遍历列表(一次查找重复项,第二次+删除所有重复项)。 -
另外,不要将
Strings 与==比较,使用equals或equalsIgnoreCase。 -
你为什么不简单地这样做
list.stream().distinct().collect(Collectors.toList());? -
@VictorGubin .distinct() 调用在内部创建了一个临时的 LinkedHashSet。挑战是在不使用临时缓冲区的情况下做到这一点。我的回答提供了一种方法。