сортировка объектов в Java - PullRequest
2 голосов
/ 01 мая 2009

я хочу сделать вложенную сортировку. У меня есть объект курса, который имеет набор приложений. Приложения имеют атрибуты, такие как время и приоритет. Теперь я хочу сначала отсортировать их по приоритету, а по приоритету - по времени.

Ответы [ 6 ]

8 голосов
/ 01 мая 2009

Например, для данного класса (открытые поля только для краткости):

public class Job {
    public int prio;
    public int timeElapsed;
}

вы можете реализовать сортировку по времени, используя метод статической сортировки (List, Comparator) в классе java.util.Collections. Здесь создается анонимный внутренний класс для реализации компаратора для «Job». Это иногда называют альтернативой указателям на функции (поскольку в Java их нет).

public void sortByTime() {
    AbstractList<Job> list = new ArrayList<Job>();
    //add some items
    Collections.sort(list, new Comparator<Job>() {
        public int compare(Job j1, Job j2) {
            return j1.timeElapsed - j2.timeElapsed;
        }
    });
}

Запомните модель контракта метода сравнения (): http://java.sun.com/javase/6/docs/api/java/util/Comparator.html#compare(T,%20T)

3 голосов
/ 01 мая 2009

Для сортировки по нескольким критериям используется пара общих подтверждений с использованием интерфейса Comparable:

  • напишите ваш метод compareTo (), чтобы он сравнивал одно поле, а затем продолжал сравнивать другое, если он не может вернуть порядок, основанный на первом;
  • если вы осторожны, то снова, в вашем методе compareTo () вы можете преобразовать комбинацию обоих критериев в одно целое число, которое затем сможете сравнить.

Первый из этих подходов, как правило, предпочтительнее и, скорее всего, будет правильным (даже если код выглядит немного более громоздким).

См. Пример на моем веб-сайте , позволяющий сортировать объекты Java , где показан пример сортировки игральных карт по мастям и по количеству мастей.

3 голосов
/ 01 мая 2009

Ознакомьтесь с классом заказа коллекций Google по адресу http://google -collections.googlecode.com / svn / trunk / javadoc / index.html? Com ​​/ google / common / collect / Ordering.html, В нем должно быть все, что вам нужно, плюс еще. В частности, вы должны взглянуть на составной метод, чтобы получить ваш второй заказ.

1 голос
/ 10 мая 2016

Вот мое мнение по этому 7-летнему вопросу, о котором все еще иногда сообщают:

  1. Создайте статический метод в вашем объекте подобно (только если вы используете другие библиотеки для автоматической генерации методов получения и установки):
public static String getNameFrom(Order order){
    return order.name;
}

Тогда попробуйте использовать что-то вроде этого:

Collections.sort(orders, Comparator.comparing(Order::getNameFrom));
  1. Для более элегантного подхода я всегда предпочитаю не менять сущность, а использовать более продвинутое кодирование с Lambdas. Например:
Collections.sort(orders, (order1, order2) ->
order1.name.compareTo(order2.name);
1 голос
/ 23 июля 2009

Вычитать два числа, как в примере выше, не всегда хорошая идея.

Подумайте, что произойдет, если вы сравните -2 147 483 644 с 2 147 483 645. Вычитание их приведет к переполнению целого числа и, следовательно, к положительному числу. Положительное число означает, что компаратор утверждает, что -2 147 483 644 больше, чем 2 147 483 645.

-5 - 6 = -7
-2,147,483,644 - 2,147,483,645 = 1

Вычитать, чтобы найти значение сравнения, еще более опасно, когда вы рассматриваете сравнение длинных или двойных значений, поскольку их нужно привести обратно к целым числам, что дает еще одну возможность для переполнения. Например, никогда не делайте так:

class ZardozComparorator implements Comparator<Zardoz>{
    public int compare(Zardoz z1, Zardoz z2) {
        Long z1long = Long.getLong(z1.getName());
        Long z2long = Long.getLong(z2.getName());


        return (int)(z1long-z2long);
    }

}

Вместо этого используйте метод сравнения объекта, который вы сравниваете. Таким образом, вы можете избежать переполнения и при необходимости вы можете переопределить метод сравнения.

class ZardozComparorator implements Comparator<Zardoz>{
    public int compare(Zardoz z1, Zardoz z2) {
        Long z1long = Long.getLong(z1.getName());
        Long z2long = Long.getLong(z2.getName());


        return z1long.compareTo(z2long);
    }

}
1 голос
/ 01 мая 2009

Вы уже задавали этот вопрос в другом месте. Написать реализацию java.util.Comparator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...