2013-10-01 4 views
0

ITSPoI allowedPoi = j.next()allowedPoIs.remove(k)는 실행 후 다음 에러를 제공하는 라인 :java.util.ConcurrentModificationException리스트의 요소를 제거한 후

java.util.ConcurrentModificationException 의 java.util.ArrayList $ Itr.checkForComodification에서 (알 당신이 루프에서 실행할 때 소스)

private Map<String,Integer> findClosest(Route tempRoute, List<ITSPoI> allowedPoIs, List<ITSPoI> tabulist) { 
    double cost,mincost = 999999999; 
    Map<String,Integer> closest = new HashMap<String,Integer>(); 

    for (int i=0; i<tempRoute.getPOIs().size(); i++)  { 
     int k = 0; 
     for(Iterator<ITSPoI> j = allowedPoIs.iterator(); j.hasNext();) { 

      ITSPoI allowedPoi = j.next(); 
      if (!intabu(allowedPoi,tabulist)) 
      { 
       try 
       { 
        cost = _cvrtw.getCostMatrix().getCost(tempRoute.getPOI(i).getNodeId(),allowedPoi.getNodeId()); 

        if (cost<mincost){ 
         mincost = cost; 
         closest.put("index",i); 
         closest.put("poi",k); 
         allowedPoIs.remove(k); 

        } 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
      k++; 
      } 
     } 
    return closest; 
    } 
+0

그것은 일반적으로 허용되지 않습니다 : 그것은 명확하게 대신 allowedPoIs.remove(k);

내가 while이 방법을 작성합니다

j.remove(); 

: 같은 iterator에서 제거 다른 스레드가이 스레드를 반복합니다. – Ashok

+0

@Ashok - 또는 동일한 스레드 *가 반복되는 동안 (이는 더 일반적인 문제이며 여기에서 문제입니다). –

+0

예 동의어 :)'Array'를'Vector' 또는'List myList = Collections.synchronizedList (myList);로 대체 할만큼 충분히 – Ashok

답변

4

당신은 allowedPoIs에서 요소를 제거 할 수 없습니다. 하나 개의 스레드가 컬렉션 동안을 수정하는

private Map<String,Integer> findClosest(Route tempRoute, List<ITSPoI> allowedPoIs, List<ITSPoI> tabulist) { 
    double cost,mincost = 999999999; 
    Map<String,Integer> closest = new HashMap<String,Integer>(); 

      Iterator<ITSPoI> iter; 

    for (int i=0; i<tempRoute.getPOIs().size(); i++)  { 
     int k = 0; 

     iter = allowedPoIs.iterator(); 

     while(iter.hasNext()){ 
      ITSPoI allowedPoi = iter.next(); 
      if (!intabu(allowedPoi,tabulist)) 
      { 
       try 
       { 
        cost = _cvrtw.getCostMatrix().getCost(tempRoute.getPOI(i).getNodeId(),allowedPoi.getNodeId()); 

        if (cost<mincost){ 
         mincost = cost; 
         closest.put("index",i); 
         closest.put("poi",k);       
         iter.remove(); // fix 
        } 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
      k++; 
     }  

    } 
    return closest; 
} 
관련 문제