Сортировка по дате — от последней к самой старой

Collections.sort(someList, new Comparator<SomeObject>() {
            public int compare(final SomeObject object1, final SomeObject object2) {
                return (object1.getSomeDate()).compareTo(object2.getSomeDate()); 
            }}
        );

Будет ли это давать мне объекты с самыми последними датами, что означает, что список будет содержать набор объектов с самой последней датой до самой старой даты?


person Erika Szabo    schedule 09.04.2010    source источник
comment
Почему бы не запустить тест, чтобы узнать?   -  person GaryF    schedule 09.04.2010


Ответы (6)


Comparator.comparing

Вы можете передать ссылку на метод в Comparator.comparing.

Если вы хотите, чтобы объекты были отсортированы в порядке возрастания на основе даты:

someList.sort(Comparator.comparing(SomeObject::getSomeDate));

or

someList.sort(Comparator.comparing(SomeObject::getSomeDate).reversed());

по убыванию.

person senjin.hajrulahovic    schedule 06.11.2018

Чтобы убедиться, что вы можете использовать:

Collections.sort(someList, new Comparator<SomeObject>() {
        public int compare(final SomeObject object1, final SomeObject object2) {
            return object1.getSomeDate().after(object2.getSomeDate()) ? 1 : -1; 
        }}
);
person Roman    schedule 09.04.2010
comment
Не нарушит ли это договор Comparable относительно равных элементов? Для двух одинаковых объектов даты и сравнение (дата1, дата2), и сравнение (дата2, дата1) вернут -1 в вашей реализации. - person Jörn Horstmann; 09.04.2010
comment
@ Jörn Horstmann: теоретически да, но на практике я не уверен, что это тот случай, когда стоит добавить еще одну (почти такую ​​же) проверку, чтобы получить тот же результат. - person Roman; 09.04.2010
comment
@Kevin Bourrillion: можете ли вы привести более содержательные аргументы? - person Roman; 10.04.2010
comment
@Roman Collections.sort, TreeMap и т. д. могут вызвать исключение, если контракт нарушен. Из Javadocs: Collections.sort может вызвать ошибку IllegalArgumentException - (optional) if the implementation detects that the natural ordering of the list elements is found to violate the Comparable contract - person Stefnotch; 25.11.2017

Порядок по умолчанию Date будет помещать более новые даты после более старых дат, поэтому самые старые даты будут в начале вашего списка, а самые новые даты - в конце. По моему мнению, Comparators всегда было трудно читать, поэтому я переключился на использование Ordering, которые реализуют Comparator немного чище. Например, ваш Comparator может быть записан так:

Ordering<SomeObject> order = Ordering.natural().onResultOf(new Function<SomeObject, Date>() {
    public Date apply(SomeObject object) {
        return object.getDate();
    }
});
Comparator<SomeObject> comparator = order; // Ordering implements Comparable so this would be legal to do
Collections.sort(someList, order);

Компаратор порядка, созданный этим кодом, будет сортировать объекты SomeObject на основе их Date, используя естественный порядок Date. Но что делает Ordering действительно хорошим, так это то, что некоторые дополнительные методы изменяют порядок без необходимости писать какую-либо логику, например, чтобы изменить порядок дат от самых новых к самым старым, вам просто нужно добавить вызов reverse():

Ordering<SomeObject> order = Ordering.natural().reverse().onResultOf(new Function<SomeObject, Date>() {
    public Date apply(SomeObject object) {
        return object.getDate();
    }
});
person Yanamon    schedule 09.04.2010
comment
единственное, чего я здесь не понимаю, так это почему у вас есть временная переменная «компаратор». Вы им не пользуетесь и не нуждаетесь в нем. Обратите внимание, что помимо Collections.sort(someList, order) вы также можете сделать List<SomeObject> newList = order.sortedCopy(someList). - person Kevin Bourrillion; 09.04.2010
comment
В основном это было сделано, чтобы ясно показать, что Ordering‹SomeObject› реализует Comparator‹SomeObject›, но спасибо за комментарий о sortedCopy, я раньше не замечал этот метод. - person Yanamon; 11.04.2010

Это старо, но может быть кто-то может использовать его. Его можно отсортировать с помощью java8 следующим образом:

  someList.sort(Comparator.comparing(listMember::dateProducingMethod))
person burbak    schedule 05.11.2018

Используя lambdaj, вы можете добиться того же результата более простым и читаемым способом, как показано ниже. :

sort(someList, on(SomeObject.class).getSomeDate());

Гораздо лучше, чем писать малопонятный внутренний класс, не так ли?

person Mario Fusco    schedule 10.04.2010

Попробуй это:

  List<Date> list=new ArrayList<Date>();
  //add some dates to list
  Collections.sort(list, new Comparator<Date>() {
      public int compare(final Date object1, final Date object2) {
          return Long.compare(object1.getTime(),object2.getTime());
      }}
  );

Date.getTime() «преобразует» дату в длинную, которую легче сравнивать и сортировать.

Во всяком случае за кулисами Лонги сравнивают с этим:

public static int compare(long x, long y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

Если вы хотите инвертировать сортировку, просто умножьте на -1 следующим образом:

  List<Date> list=new ArrayList<Date>();
  //add some dates to list
  Collections.sort(list, new Comparator<Date>() {
      public int compare(final Date object1, final Date object2) {
          return Long.compare(object1.getTime(),object2.getTime())*-1;
      }}
  );
person Raymond Arteaga    schedule 06.11.2018