2013-10-01 48 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

它不是一般允许一个线程修改集合,而另一个线程正在迭代它。 – Ashok

+0

@Ashok - 或者*同一个线程*正在迭代它,这是一个更常见的问题(以及这里的问题)。 –

+0

yes concur .. :) – Ashok

回答

4

,当你在循环中运行您不能从allowedPoIs删除元素。从iterator像删除它:

j.remove(); 

代替allowedPoIs.remove(k);

我会写这种方法与while这样可以很清楚:

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; 
} 
相关问题