6

我正在尝试创建一棵霍夫曼树,并且正在尝试合并两棵树。我无法弄清楚如何在没有得到“并发修改异常”的情况下在我的程序中删除树,因为我正在迭代一个列表并同时尝试从列表中删除。

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 \n");
                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);
        }
4

4 回答 4

8

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

于 2013-04-28T19:27:36.383 回答
4

如果要在迭代列表时修改列表,则需要使用Iterator

以下是一些回答这个问题的问题:

于 2013-04-28T19:27:12.090 回答
3

您的代码无法编译,因此我们可以帮助您的方式有限。但总的来说,解决此问题的方法是使用 anIterator而不是 foreach 循环。

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

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

但事实并非如此,它会为您提供您想要的结果:

    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”。

于 2013-04-28T19:27:26.620 回答
1

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

于 2013-04-28T19:27:49.153 回答