【问题标题】:why am i getting a java.util.ConcurrentModificationException in the advanced for loop?为什么我在高级 for 循环中得到 java.util.ConcurrentModificationException?
【发布时间】:2017-03-14 21:11:29
【问题描述】:

与我见过的其他异常情况不同,我不断遇到的异常发生在 for 循环,我在下面用 //哪里出错// 进行了评论。在我的实现中,List partialR 在我迭代它时并没有改变,所以我真的很困惑。

public class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        result.add(new ArrayList<Integer>());
        return permute(nums, 0, result);
    }

    public List<List<Integer>> permute(int[] nums, int i, List<List<Integer>> result){
        if (i == nums.length){
            return result;
        }
        int num = nums[i];
        List<List<Integer>> partialR = permute(nums, i+1, result);
        System.out.println("partialR"+partialR);
        for (List<Integer> t : partialR){***//where it goes wrong//***
            System.out.println("t"+t);
            for (int j=0; j <= t.size(); j++){
                System.out.println("j="+j);
                List<Integer> subs = insert(t,num,j);
                result.add(subs);
                System.out.println("result"+result);
            }
        }
        System.out.println("result");
        return result;
    }
    public List<Integer> insert(List<Integer> t, int num, int j){
        List<Integer> temp = new ArrayList<>();       
        if (j == 0){
            temp.add(num);
            temp.addAll(t);
            System.out.println("temp"+temp);
            return temp;
        }else if(j == t.size()){
            temp.addAll(t);
            temp.add(num);
            return temp;
        }
        List<Integer> temp1 = new ArrayList<Integer> (t.subList(j,t.size()-1));
        List<Integer> temp2 = new ArrayList<Integer> (t.subList(0,j-1));
        temp.addAll(temp1);
        temp.add(num);
        temp.addAll(temp2);
        return temp;
    }
}

【问题讨论】:

  • 在我的实现中,List partialR 在我迭代时不会改变。看起来可能是这样,但partialR 引用了与result 相同的列表,您显然正在修改它。

标签: java list exception arraylist concurrentmodification


【解决方案1】:

您将result 传递给permute,它会返回result。 所以当你这样做时:

List<List<Integer>> partialR = permute(nums, i+1, result);

现在partialR 也指向result。 然后当你用for (List&lt;Integer&gt; t : partialR) 迭代它时, 当你修改 result.add(subs) 时,你修改 result。 所以实际上,您在迭代 result 时正在修改它, Java 中迭代器的 fail-fast 行为不允许这样做。 (您可以在 ConcurrentModificationException 的 javadoc 中阅读更多相关信息。)

您可以通过在此处创建一个新的ArrayList 来解决此问题:

List<List<Integer>> partialR = new ArrayList<>(permute(nums, i + 1, result));

还有一些其他的错误,与并发修改无关。 在insert 中,创建temp1temp2 的值范围不正确。 更正并简化,可以写成:

List<Integer> temp1 = t.subList(j, t.size());
List<Integer> temp2 = t.subList(0, j);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多