关于java:如何在修改列表时从列表中删除

How to delete from a list, while modifying the list

本问题已经有最佳答案,请猛点这里访问。

我正在尝试创建一棵哈夫曼树,并且正在尝试合并两棵树。如果不获得"并发修改异常",我就无法理解如何删除程序中的树,因为我正在迭代一个列表并试图同时从列表中删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
BinaryTree<Character, Integer> t1 = null;
        BinaryTree<Character, Integer> t2 = null;
        BinaryTree<Character, Integer> tFinal = null;
        int treeSize = TREES.size();

        for (int i = 0; i < treeSize; i++) {

            for (BinaryTree<Character, Integer> t : TREES) {
                System.out.println("treeSize" + treeSize);
                System.out.println(t.getRoot().getElement()
                        +"  t.getRoot().getElement()");

                // here I edited the merge function in Binary Tree to set
                // the new root
                // to have null value for value, and itemTwo for weight
                System.out.println(t.getRoot().getValue() +" weight of tree
"
);
                t1 = t;
                TREES.remove(t);

            }
            for (BinaryTree<Character, Integer> t : TREES){
                t2 = t;
                System.out.println(t);
            }
            int weight = t1.getRoot().getElement() + t2.getRoot().getElement();
            tFinal.merge(null, weight, t1, t2);
        }


Java阻止您修改循环中的集合。您需要使用迭代器。


如果您想在遍历它的同时修改列表,则需要使用迭代器。

下面是一些这样的问题:

  • 迭代集合,避免在循环中移除时发生ConcurrentModificationException

  • 在不使用ConcurrentModificationException的情况下,如何在为每个循环迭代时修改集合?


您的代码无法编译,因此我们无法帮助您。但一般来说,解决这个问题的方法是使用Iterator而不是foreach循环。

例如,这给出了一个并发修改异常:

1
2
3
4
    List<String> l = new ArrayList<String>(asList("a","b","c"));
    for (String s : l) {
        l.remove(s);
    }

但事实并非如此,它给了你想要的结果:

1
2
3
4
5
6
    List<String> l = new ArrayList<String>(asList("a","b","c"));
    for (Iterator<String> iterator = l.iterator(); iterator.hasNext(); ) {
        String s = iterator.next();
        iterator.remove();
    }
    System.out.println(l.size());

后者将输出"0"。


解决方案是将要删除的项存储在另一个列表中,然后在迭代之后删除它们。