Сортировка по дате - от последних к старым - PullRequest
2 голосов
/ 09 апреля 2010
Collections.sort(someList, new Comparator<SomeObject>() {
            public int compare(final SomeObject object1, final SomeObject object2) {
                return (object1.getSomeDate()).compareTo(object2.getSomeDate()); 
            }}
        );

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

Ответы [ 6 ]

3 голосов
/ 07 ноября 2018

Comparator.comparing

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

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

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

или

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

по убыванию.

2 голосов
/ 09 апреля 2010

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

Collections.sort(someList, new Comparator<SomeObject>() {
        public int compare(final SomeObject object1, final SomeObject object2) {
            return object1.getSomeDate().after(object2.getSomeDate()) ? 1 : -1; 
        }}
);
1 голос
/ 05 ноября 2018

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

  someList.sort(Comparator.comparing(listMember::dateProducingMethod))
1 голос
/ 09 апреля 2010

Порядок по умолчанию Date установит более новые даты после более старых, так что самые старые даты будут в начале вашего списка, а самые новые - в конце. Comparators всегда было трудно читать, по моему мнению, поэтому я переключился на использование Ordering объектов Google, которые реализуют 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 (): 1014 *

Ordering<SomeObject> order = Ordering.natural().reverse().onResultOf(new Function<SomeObject, Date>() {
    public Date apply(SomeObject object) {
        return object.getDate();
    }
});
0 голосов
/ 07 ноября 2018

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

  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;
      }}
  );
0 голосов
/ 10 апреля 2010

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

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

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

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