按日期对 ArrayList 中的对象进行排序?

2022-08-31 06:48:46

我找到的每个示例都是按字母顺序执行此操作的,而我需要按日期对元素进行排序。

我的 ArrayList 包含其中一个数据成员是 DateTime 对象的对象。在 DateTime 上,我可以调用这些函数:

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

因此,为了进行比较,我可以做这样的事情:

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

我应该在 if 块内做什么?


答案 1

您可以使对象具有可比性:

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,以避免 NullPointerExceptions:

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

答案 2

从 Java 8 开始,List 接口提供了排序方法。结合 lambda 表达式,最简单的解决方案是

// 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()));

反向排序

Java 8还带有一些方便的反向排序方法。

//requested by lily
list.sort(Comparator.comparing(o -> o.getDateTime()).reversed());