Когда я выполняю следующий код, по какой-то причине я получаю
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++;
}
}
}




Вы использовали subList для разделения и перемещения по списку. Arraylist не позволяет вам изменять значения, когда вы находитесь в середине обхода, и выдает исключение Concurrent Modification Exception.
Один из способов решения этой проблемы — удалить зависимость от метода subList и обновить рекурсивный метод, чтобы он принимал List, startIndex и endIndex.
Другой способ обойти это — использовать потокобезопасную реализацию List. Вы можете выбрать этот маршрут, если сможете изменить структуру данных списка.
Надеюсь это поможет.
Наряду с OutOfBoundsException в сообщении вы увидите индекс, вызвавший исключение. Используя это, вы сможете выяснить, какое граничное условие имеет проблему в вашем коде.
Спасибо за ответ. Теперь я, кажется, получаю исключение за пределами границ... Вот что я изменил: pastebin.com/MZXa3jcJ