2013-03-16 81 views
0

我试图按开始时间排序时间跨度列表(用Time []数组表示开始时间和结束时间)。我尝试使用下面的嵌套循环可以这样做:ConcurrentModificationException?

  for (Time[] span : workingList){ 
      Time[] compareTo = workingList.get(0); 

       for (Time[] inSpan : workingList){ 
        if (inSpan[0].before(compareTo[0])){ 
        compareTo = inSpan; 
        } 
       } 
      workingList.remove(compareTo); 
      toReturn.add(compareTo); 
     } 

    } 

但在该行for (Time[] span : workingList)(一个在顶部)抛出一个java.util.ConcurrentModificationException。我以前从未见过这个例外,有人可以向我解释它的含义和原因。

我也接受更好的算法建议。

+0

供将来参考:当您有关于例外的问题时,您可以随时查阅文档。如果你谷歌“_Java 7 ConcurrentModificationException_”,第一个结果会带你到文档。如果您阅读该页面顶部的概述,它将解释这种确切的情况。 – jahroy 2013-03-16 01:15:30

回答

6
workingList.remove(compareTo); 

您正在修改集合,同时对其进行迭代。

你应该使用类似:

ListIterator<Time[]> it = workingList.listIterator(); 

while (it.hasNext()) { 
    Time[] time = it.next(); 
    .. 
    it.remove(); 
} 

有办法,也没有使用列表迭代但这似乎更正确。

+0

另一种选择是建立一个你想删除的项目列表** WHILE **迭代,并删除它们**在**迭代之后。 – jahroy 2013-03-16 01:12:53

+0

它主要取决于算法,在OP案例中,如果他正在删除的元素并不总是与它正在迭代的元素相同,那么构建临时列表可能是唯一的选项。 – Jack 2013-03-16 01:14:40

1

我的建议是,您使用Collections.sort()订购清单。它为你做了排序,并使你能够更清晰地理解你正在做的事情。你需要指定你自己Comparator调用方法时 - 这样:

Collections.sort(workingList,new Comparator<Time[]>() { 
     @Override 
     public int compare(Time[] time1, Time[] time2) { 
      return time1[0].before(time2[0]); 
     } 
    }); 

这将排序workingList为您的规格。

相关问题