当我执行以下代码时,由于某种原因,我得到
java.util.ConcurrentModificationException
我尝试研究此异常,我相信这是因为在我尝试再次访问列表时不断编辑列表。
这真的很令人沮丧,因为当我不使用 ArrayLists,而是使用常规数组时,一切似乎都工作正常,所以我不确定如何使用相同的过程只处理数组列表并让它工作。
代码如下:
public static void mergeSort(List<Integer> indexList, int listLen) {
if (listLen < 2) {
// calls merge method when 1 term is in either left or right arrays
return;
}
int middlepoint = listLen / 2;
List<Integer> leftArr = indexList.subList(0, middlepoint);
List<Integer> rightArr = indexList.subList(middlepoint, listLen);
// passing the numList to the merge (once all numbers are in groups of 1)
merge(indexList, leftArr, rightArr, middlepoint, listLen - middlepoint);
}
public static void merge(
List<Integer> numList, List<Integer> leftArr, List<Integer> rightArr, int left, int right) {
// while there are terms in both lists
int i = 0, j = 0, k = 0;
// while numbers in both lists
while (i < left && j < right) {
int leftVal = leftArr.get(i);
int rightVal = rightArr.get(j);
// if the term in the right array is bigger/equal (filling the final list smallest to greatest)
if (leftVal <= rightVal) {
numList.add(k++, leftVal);
i++;
}
else {
numList.add(k++, rightVal);
j++;
}
while (i < left) {
numList.add(k++, leftVal);
i++;
}
while (j < right) {
numList.add(k++, rightVal);
j++;
}
}
}
您已使用子列表来划分和遍历列表。Arraylist 不允许您在遍历过程中修改值,并引发并发修改异常。
解决此问题的一种方法是删除对子列表方法的依赖,并更新递归方法以采用 List、startIndex 和 endIndex。
另一种解决方法是使用 List 的线程安全实现。如果可以更改列表数据结构,则可以采用此路线。
希望这有帮助。