2017-03-14 2 views
1

내가 본 다른 예외 시나리오와 달리 루프가 일 때 에서 계속 발생하는 예외는 다음과 같이 설명합니다. // 여기가 잘못되어 //. 그리고 내 구현에서는 List partialR이 반복되는 동안 변경되지 않으므로 혼란 스럽습니다.고급 for 루프에서 java.util.ConcurrentModificationException이 발생하는 이유는 무엇입니까?

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; 
    } 
} 
+0

* 그리고 내 구현이 목록 partialR이 변경되지 않습니다 *. 그렇게 보일지도 모르지만'partialR'은'result'와 같은 목록을 참조합니다. 이것은 분명히 수정 중입니다. – shmosel

답변

2

당신은 permuteresult을 통과하며 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에서 temp1temp2을 만드는 값 범위가 잘못되었습니다. 가 수정 및 단순화, 당신은 쓸 수 있습니다 : 나는 그것을 반복하면서

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

정말 고마워요. 다 잘 풀어집니다. –

관련 문제