我正在尝试按开始时间排序时间跨度列表(用开始时间和结束时间表示为Time []数组)。我正在尝试使用以下嵌套循环来执行此操作:
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);
}
}
但它在行java.util.ConcurrentModificationException
(顶部的那个)上放了一个for (Time[] span : workingList)
。我以前从未见过这个例外,有人可以向我解释它的含义和原因。
我也愿意接受更好的算法建议。
答案 0 :(得分:6)
workingList.remove(compareTo);
您在迭代时修改集合。
你应该使用类似的东西:
ListIterator<Time[]> it = workingList.listIterator();
while (it.hasNext()) {
Time[] time = it.next();
..
it.remove();
}
有些方法也可以不使用列表迭代器,但这似乎更正确。
答案 1 :(得分:1)
我的建议是您使用Collections.sort()
订购列表。它为您排序,并使您的可读性更具可读性。调用方法时,您需要指定自己的Comparator
:
Collections.sort(workingList,new Comparator<Time[]>() {
@Override
public int compare(Time[] time1, Time[] time2) {
return time1[0].before(time2[0]);
}
});
这会将workList排序为您的规格。