使用ArrayList实现合并排序的问题

时间:2019-04-12 18:39:39

标签: java algorithm sorting

当我执行以下代码时,由于某种原因我得到了

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 :(得分:0)

您已使用subList划分和遍历List。 Arraylist不允许您在遍历过程中修改值,并引发并发修改异常。

解决此问题的一种方法是删除对subList方法的依赖关系,并更新您的递归方法以采用List,startIndex和endIndex。

另一种解决方法是使用List的Thread安全实现。如果可以更改列表数据结构,则可以采用此路线。

希望这会有所帮助。