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

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

最佳答案

您已经使用subList 对List 进行了划分和遍历。 Arraylist 不允许您在遍历过程中修改值并抛出并发修改异常。

解决此问题的一种方法是删除对 subList 方法的依赖并更新递归方法以获取 List、startIndex 和 endIndex。

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

希望这对您有所帮助。

关于java - 使用 ArrayList 实现合并排序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657749/

相关文章:

java - 如何使用 Selenium WebDriver (java) 和 Chrome 验证特定 <DIV> 标记下文本是否存在?

arrays - 在不同数组中查找 "most common elements"的算法

javascript - Angularjs orderBy(使用带有反向和多个字段的默认顺序)

javascript - 按嵌套属性对 JSONarray 进行排序

python - 合并两个排序列表时,为什么我会得到两个不同的输出 (Python)

java - 什么时候在 Java 中必须有默认构造函数和参数化构造函数?

java - 两个 Java Date 对象之间的小时+分钟

java - org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration 中的构造函数需要一个 bean,但找到了 3 个

java - 通过扫描文件中的数据和特定日期的输出数据来合并不同日期的结果

python - 在可能不规则的字符串/数组中查找最常见重复模式的算法