在java中对对象数组进行排序的最快方法

时间:2015-04-21 16:11:34

标签: java arrays sorting

我有一个名为apple的类,它包含3个值int xint yint weight。然后我创建了一个苹果类型对象的数组。现在我想根据权重对对象数组进行排序,这意味着具有最低权重的苹果对象应该是第一个,依此类推。

我知道有很多方法可以通过使用Arrays.sort等或比较器来实现这一目标。

我想知道在Java中这种方法的最快方法是什么?可能有一个案例,我有500,000个对象,所以我想知道我应该使用哪种,更重要的是哪种方法会给我最好的方法。我甚至用Hoare分区编写了自己的快速排序。

Apple类代码

public class Apple {
    public int x;
    public int y;
    public int weight;

    public Apple(int a, int b, int w) {
        x = a;
        y = b;
        weight = w;
    }
}

主类代码

public class main {
    static Apple[] appleArray;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int size = sc.nextInt();
        int totalApples = sc.nextInt();
        appleArray = new Edge[totalApples];
        int x = 10;
        int y = 20;
        int w = 30;

        for (int i = 0; i < size; i++) {
            appleArray[i] = new Apple(x, y, w);
            x++;
            y++;
            w++;
        }
        //Now i want to sort array of apple objects based on weight
    }
}

6 个答案:

答案 0 :(得分:8)

本书提供了一个有用的备忘单,用于根据您的需求确定最佳排序:https://www.safaribooksonline.com/library/view/algorithms-in-a/9780596516246/ch04s09.html

最简单的解决方案

Arrays.sort命令使用quicksort implementation,适用于许多情况。对于您的示例代码,可能是:

Arrays.sort(appleArray, new Comparator<Apple>(){  
    @Override  
    public int compare(Apple apple1, Apple apple2){  
         return apple1.weight - apple2.weight;  
    }  
}); 

最快的解决方案

在你的情况下,你有一个包含重复的大型数组,例如阵列中的50,000个苹果可能都重3盎司......因此,您可能选择实施bucket sort以提高快速排序的性能,在这种情况下浪费。这是一个example implementation

也许在一些研究选择的基础上,使用适合的Java API来确定输入集的最佳解决方案。

答案 1 :(得分:7)

我首先使用Java API。如果这还不够快,那么我会搜索优化的排序库。

另外考虑一个数据库,数据库引擎速度快,并且可以对大型数据集进行优化。

答案 2 :(得分:3)

您可以使用Arrays.sort传递自定义Comparator或将Apple定义为Comparable

答案 3 :(得分:2)

我们可以将Collections.sort与自定义Comparator一起使用。

class Apple {
    public final int weight;
    // ...
};

List<Apple> apples = // ...

Collections.sort(apples, new Comparator<Apple>() {
    @Override public int compare(Apple a1, Apple a2) {
        return a1.weight - a2.weight; // Ascending
    }

});

答案 4 :(得分:2)

如果你的对象中有任何你需要排序的数字或整数,你可以这样做 -

List<Object> obj = new ArrayList<Object>();

Collections.sort(obj, new Comparator<Object>() {
    @Override
    public int compare(Object object1, Object object2) {
        return object1.getNumber() > object2.getNumber() ? 1 : -1;
    }
});

如果没有Number或Integer,你可以对它进行排序,而你只是在你的对象中使用字符串,而不是通过枚举为字符串赋值。

enum Code {
    Str1(1), Str2(2), Str3(3), Str4(4), Str5(5));

    int sortNumber;

    Code(int sortNumber) {
        this.sortNumber = sortNumber;
    }

    int returnNumber() {
        return sortNumber;
    }
};

public static void main(String[] args) {
    List<Object> obj = new ArrayList<Object>();

    Collections.sort(obj, new Comparator<Object>() {
        @Override
        public int compare(Object object1, Object object2) {
            return Code.valueOf(object1.getStr()).returnNumber() > Code.valueOf(object2.getStr()).returnNumber() ? 1 : -1;
        }
    });
}

答案 5 :(得分:0)

在 Java8 附带的新 lambda 表达式的帮助下,现在对自定义对象数组进行排序变得更容易和更短。下面的代码展示了当前场景中 lambda 表达式的使用。

path\src\api\v1\controllers\Site>node child.controller.js
undefined
Database Connected Successfully...
error