Проблема с реализацией сортировки слиянием с использованием ArrayList - PullRequest
0 голосов
/ 12 апреля 2019

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

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++;
            }
        }
    }

1 Ответ

0 голосов
/ 12 апреля 2019

Вы использовали subList для разделения и обхода списка. Arraylist не позволяет вам изменять значения, когда вы находитесь в середине обхода, и выдает исключение одновременной модификации.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...