繁体   English   中英

如何在java中使用嵌套迭代器从LinkedList中删除元素

[英]How to remove elements from LinkedList with nested iterators in java

我试图从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来解决这个问题?

编辑 :挑战是不使用临时缓冲区这样做,否则一个额外的列表将成功。

如果不使用迭代器或foreach循环,则不会收到ConcurrentModificationException 例如,您可以这样做:

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 1, 2, 3));

for (int i = 0; i < list.size() - 1; i++) {
    for (int j = i + 1; j < list.size(); j++) {
        if (list.get(i).equals(list.get(j))) {
            list.remove(j);
            j--;
        }
    }
}

System.out.println(list); // [1, 2, 3]

以下是不使用任何临时附加集合的O(N ^ 2)算法。 向后迭代,从最后一个元素到第二个元素,如果列表的当前元素已经存在于列表的前面,则删除当前元素。

public static void removeDuplicates(List<?> list) {
    ListIterator<?> iter = list.listIterator(list.size());
    for (int index = list.size() - 1; index > 0; index--) {
        Object element = iter.previous();
        if (list.subList(0, index).contains(element))
            iter.remove();
    }
}

测试:

@Test
void removeDuplicatesShouldRemoveAllDuplicates() {
    List<Integer> list = new LinkedList<>(Arrays.asList(1,2,1,3,1,4,5,5,1));
    Main.removeDuplicates(list);
    assertEquals(Arrays.asList(1,2,3,4,5), list);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM