有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何更快地排序ArrayList?

我正在做一个类项目,我需要根据自定义对象的int属性值对ArrayList进行排序

我现在用的是这样的东西:

public static void Sort(ArrayList <MyObject> objectList){

    for (int i = 0; i < list.size()-1; i++){

        for (int j = 0; j < list.size()-1; j++){

            if (objectList.get(j).getA() > objectList.get(j+1).getA()){

                Collections.swap(objectList, j, j+1);
            }
        }    
    }    
}

如果ArrayList的元素少于10^4,则程序运行良好。但是,如果我尝试对10^5个元素进行排序,需要几分钟,我需要对10^6个元素进行排序。有什么建议吗


共 (2) 个答案

  1. # 1 楼答案

    目前,您的实现是O(n^2),这意味着随着阵列的增长,时间将以二次方的方式扩展

    不必详细介绍使用mergesort(即O(log(n) x n))的方法,最快的方法就是使用Java的内置解决方案进行排序

    Collections.sort(list);
    

    链接到API。还有Collection.sort(list, comparator)允许您提供自己的comparator

    你想让它更快吗?您可以使用Java's new feature,它允许您并行地对多个核心进行排序。这是API。注意Arrays.sort()Arrays.parallelSort()将数组作为第一个参数。您需要使用list.toArray()将列表转换为数组

    最后,请注意List#sort()仅在Java8中是introduced

  2. # 2 楼答案

    使用List::sort方法:

    objectList.sort(Comparator.comparing(MyObject::getA));
    

    正如@lexicore在下面提到的,似乎getA()返回一个数字类型,在这种情况下,如果它返回int,那么最好使用comparingInt而不是上面的comparing,如果它是long使用comparingLong,或者如果它是float/{},那么使用comparingDouble可以获得更好的性能