为什么我在高级 for 循环中得到 java.util.ConcurrentModificationException?
why am i getting a java.util.ConcurrentModificationException in the advanced for loop?
与我见过的其他异常情况不同,我不断遇到的异常发生在 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;
}
}
您将 result
传递给 permute
,它 returns result
。
所以当你这样做时:
List<List<Integer>> partialR = permute(nums, i+1, result);
现在 partialR
也指向 result
。
然后当你用 for (List<Integer> t : partialR)
遍历它时,
当您执行 result.add(subs)
时,您修改了 result
。
所以实际上,你在迭代 result
的同时修改它,
Java 中迭代器的 快速失败 行为不允许这样做。
(您可以在 ConcurrentModificationException 的 javadoc 中阅读更多相关信息。)
您可以通过在此处创建新的 ArrayList
来解决此问题:
List<List<Integer>> partialR = new ArrayList<>(permute(nums, i + 1, result));
还有一些其他错误,与并发修改无关。
在 insert
中,创建 temp1
和 temp2
的值范围不正确。
更正和简化,你可以写:
List<Integer> temp1 = t.subList(j, t.size());
List<Integer> temp2 = t.subList(0, j);
与我见过的其他异常情况不同,我不断遇到的异常发生在 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;
}
}
您将 result
传递给 permute
,它 returns result
。
所以当你这样做时:
List<List<Integer>> partialR = permute(nums, i+1, result);
现在 partialR
也指向 result
。
然后当你用 for (List<Integer> t : partialR)
遍历它时,
当您执行 result.add(subs)
时,您修改了 result
。
所以实际上,你在迭代 result
的同时修改它,
Java 中迭代器的 快速失败 行为不允许这样做。
(您可以在 ConcurrentModificationException 的 javadoc 中阅读更多相关信息。)
您可以通过在此处创建新的 ArrayList
来解决此问题:
List<List<Integer>> partialR = new ArrayList<>(permute(nums, i + 1, result));
还有一些其他错误,与并发修改无关。
在 insert
中,创建 temp1
和 temp2
的值范围不正确。
更正和简化,你可以写:
List<Integer> temp1 = t.subList(j, t.size());
List<Integer> temp2 = t.subList(0, j);