Самый быстрый способ сортировки массива объектов в java

у меня есть класс под названием apple, который содержит 3 значения как int x, int y и int weight. Затем я создал массив объектов типа яблоко. Теперь я хочу отсортировать массив объектов на основе веса, что означает, что объект apple с наименьшим весом должен быть первым и так далее.

Я знаю, что есть довольно много способов достичь этого с помощью массивов.сортировка etc или компараторы.

мне было интересно, каков самый быстрый способ сделать этот вид в 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
    }
}

5 ответов


в этой книге есть полезная шпаргалка для выбора оптимальной сортировки для ваших нужд: https://www.safaribooksonline.com/library/view/algorithms-in-a/9780596516246/ch04s09.html

самое простое решение

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

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

самое быстрое решение

In в вашем случае у вас есть большой массив, содержащий повторения, например, 50,000 яблок в вашем массиве могут весить 3 унции... Поэтому вы можете выбрать реализацию ведро вроде улучшить представление над quicksort, которое может быть расточительно в таких условиях. Вот это пример реализации.

возможно, проверьте несколько исследованных вариантов, используя API Java, когда это подходит, чтобы определить лучшее решение для вашего входного набора.


Я бы сначала использовать Java API. Если это недостаточно быстро, я бы искал оптимизированную библиотеку сортировки.

также рассмотрим базу данных, движки БД быстры и оптимизированы для сортировки больших наборов данных.


можно использовать Arrays.sort прохождения таможни Comparator и определение Apple as Comparable


мы можем использовать коллекции.сортировка с помощью пользовательского компаратора.

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
    }

});

Если в вашем объекте есть какое-либо число или целое число, над которым вы должны сортировать, вы можете сделать это -

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

и если нет числа или целого числа, по которому вы можете сортировать его, и у вас просто есть строки в вашем объекте, чем присваивать значение строкам перечислением.

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