Проблема с реализацией сортировки слиянием с использованием ArrayList

Когда я выполняю следующий код, по какой-то причине я получаю

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++;
            }
        }
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
173
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы использовали subList для разделения и перемещения по списку. Arraylist не позволяет вам изменять значения, когда вы находитесь в середине обхода, и выдает исключение Concurrent Modification Exception.

Один из способов решения этой проблемы — удалить зависимость от метода subList и обновить рекурсивный метод, чтобы он принимал List, startIndex и endIndex.

Другой способ обойти это — использовать потокобезопасную реализацию List. Вы можете выбрать этот маршрут, если сможете изменить структуру данных списка.

Надеюсь это поможет.

Спасибо за ответ. Теперь я, кажется, получаю исключение за пределами границ... Вот что я изменил: pastebin.com/MZXa3jcJ

Abwatts 12.04.2019 22:11

Наряду с OutOfBoundsException в сообщении вы увидите индекс, вызвавший исключение. Используя это, вы сможете выяснить, какое граничное условие имеет проблему в вашем коде.

krisnik 13.04.2019 06:45

Другие вопросы по теме