Сортировать объекты в ArrayList по дате?

может кто-нибудь помочь мне с этим? Каждый пример, который я нахожу, - это делать это в алфавитном порядке, в то время как мне нужны мои элементы, отсортированные по дате.

мой ArrayList содержит объекты, на которых один из datamembers является объектом DateTime. В DateTime я могу вызвать функции:

lt() // less-than
lteq() // less-than-or-equal-to

поэтому для сравнения я мог бы сделать что-то вроде:

if(myList.get(i).lt(myList.get(j))){
    // ...
}

Я не знаю, что делать внутри блока if. Есть идеи?

11 ответов


вы можете сделать ваш объект сопоставимым:

public static class MyObject implements Comparable<MyObject> {

  private Date dateTime;

  public Date getDateTime() {
    return dateTime;
  }

  public void setDateTime(Date datetime) {
    this.dateTime = datetime;
  }

  @Override
  public int compareTo(MyObject o) {
    return getDateTime().compareTo(o.getDateTime());
  }
}

и затем вы сортируете его по телефону:

Collections.sort(myList);

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

Collections.sort(myList, new Comparator<MyObject>() {
  public int compare(MyObject o1, MyObject o2) {
      return o1.getDateTime().compareTo(o2.getDateTime());
  }
});

однако вышеизложенное работает только в том случае, если вы уверены, что dateTime не является нулевым во время сравнения. Разумно также обрабатывать null, чтобы избежать Возникновению исключительных ситуаций типа NullPointerException:

public static class MyObject implements Comparable<MyObject> {

  private Date dateTime;

  public Date getDateTime() {
    return dateTime;
  }

  public void setDateTime(Date datetime) {
    this.dateTime = datetime;
  }

  @Override
  public int compareTo(MyObject o) {
    if (getDateTime() == null || o.getDateTime() == null)
      return 0;
    return getDateTime().compareTo(o.getDateTime());
  }
}

или во втором примере:

Collections.sort(myList, new Comparator<MyObject>() {
  public int compare(MyObject o1, MyObject o2) {
      if (o1.getDateTime() == null || o2.getDateTime() == null)
        return 0;
      return o1.getDateTime().compareTo(o2.getDateTime());
  }
});

начиная с Java 8 список интерфейс обеспечивает вроде метод. В сочетании с лямда - выражение самым простым решением будет

// sort DateTime typed list
list.sort((d1,d2) -> d1.compareTo(d2));
// or an object which has an DateTime attribute
list.sort((o1,o2) -> o1.getDateTime().compareTo(o2.getDateTime()));
// or like mentioned by Tunaki
list.sort(Comparator.comparing(o -> o.getDateTime()))

вы можете использовать коллекции.метод сортировки. Это статический метод. Вы передаете ему список и компаратор. Он использует модифицированный алгоритм mergesort над списком. Вот почему вы должны передать ему компаратор для выполнения парных сравнений.

Collections.sort(myList, new Comparator<MyObject> {
   public int compare(MyObject o1, MyObject o2) {
      DateTime a = o1.getDateTime();
      DateTime b = o2.getDateTime();
      if (a.lt(b)) 
        return -1;
      else if (a.lteq(b)) // it's equals
         return 0;
      else
         return 1;
   }
});

обратите внимание, что если myList имеет сопоставимый тип (тот, который реализует сопоставимый интерфейс) (например, дата, целое число или строка), вы можете опустить компаратор, и будет использоваться естественный порядок.


дано MyObject что есть DateTime членов getDateTime() метод, вы можете сортировать ArrayList, содержащую MyObject элементов DateTime объекты вроде этого:

Collections.sort(myList, new Comparator<MyObject>() {
    public int compare(MyObject o1, MyObject o2) {
        return o1.getDateTime().lt(o2.getDateTime()) ? -1 : 1;
    }
});

list.sort(Comparator.comparing(o -> o.getDateTime()));

лучший ответ IMHO от Tunaki с использованием Java 8 lambda


вот как я решил:

Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));

надеюсь это поможет вам.


все ответы здесь я нашел не обязательно сложными для простой проблемы (по крайней мере, для опытного разработчика java, которым я не являюсь). У меня была аналогичная проблема, и я случайно нашел это (и другие) решения, и хотя они предоставили указатель, для новичка я нашел, как указано выше. Мое решение зависит от того, где в объекте находится ваша дата, в этом случае дата является первым элементом объекта[] где dataVector ArrayList содержит ваш Объекты.

Collections.sort(dataVector, new Comparator<Object[]>() {
    public int compare(Object[] o1, Object[] o2) {
        return ((Date)o1[0]).compareTo(((Date)o2[0]));
    }
});

С введением в Java 1.8, потоки очень полезны в решении такого рода проблем:

Comparator <DateTime> myComparator = (arg1, arg2) 
                -> {
                    if(arg1.lt(arg2)) 
                       return -1;
                    else if (arg1.lteq(arg2))
                       return 0;
                    else
                       return 1;
                   };

ArrayList<DateTime> sortedList = myList
                   .stream()
                   .sorted(myComparator)
                   .collect(Collectors.toCollection(ArrayList::new));


это может быть старый ответ, но я использовал некоторые примеры из этого поста, чтобы создать компаратор, который будет сортировать ArrayList of HashMap<String, String> одним объектом в списке, который является меткой времени.

у меня есть эти объекты:

ArrayList<Map<String, String>> alList = new ArrayList<Map<String, String>>();

объекты карты следующие:

Map<String, Object> map = new HashMap<>();
        // of course this is the actual formatted date below in the timestamp
        map.put("timestamp", "MM/dd/yyyy HH:mm:ss"); 
        map.put("item1", "my text goes here");
        map.put("item2", "my text goes here");

это сопоставление-это то, что я использую для загрузки всех моих объектов в список массивов, используя


передайте ArrayList в аргументе.

    private static void order(ArrayList<Object> list) {

    Collections.sort(list, new Comparator() {

        public int compare(Object o2, Object o1) {

            String x1 =  o1.Date;
            String x2 =  o2.Date;

                return  x1.compareTo(x2);

        }
    });
}