ConcurrentModificationException的?

时间:2013-03-16 01:01:53

标签: java

我正在尝试按开始时间排序时间跨度列表(用开始时间和结束时间表示为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)。我以前从未见过这个例外,有人可以向我解释它的含义和原因。

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

2 个答案:

答案 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排序为您的规格。