0

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

我也愿意为此提供更好的算法建议。

4

2 回答 2

6
workingList.remove(compareTo);

您在对其进行迭代时正在修改一个集合。

你应该使用类似的东西:

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

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

也有不使用列表迭代器的方法,但这似乎更正确。

于 2013-03-16T01:04:48.073 回答
1

我的建议是您Collections.sort()用于订购清单。它为您进行排序,并使您尝试做的事情更具可读性。您需要Comparator在调用该方法时指定自己的 - 例如:

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

这会将工作列表排序为您的规格。

于 2013-03-16T01:17:04.140 回答