按日期排序ArrayList中的对象?

135 java sorting datetime

有人可以帮我弄这个吗?我找到的每个例子都是按字母顺序执行此操作,而我需要按日期排序元素.

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

lt() // less-than
lteq() // less-than-or-equal-to
Run Code Online (Sandbox Code Playgroud)

所以要比较我可以这样做:

if(myList.get(i).lt(myList.get(j))){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道在if块内做什么.有任何想法吗?

Dom*_*chi 392

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

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你通过调用它来排序:

Collections.sort(myList);
Run Code Online (Sandbox Code Playgroud)

但是,有时您不希望更改模型,例如当您想要对几个不同的属性进行排序时.在这种情况下,您可以动态创建比较器:

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

但是,只有在比较时确定dateTime不为null时,上述方法才有效.处理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());
  }
}
Run Code Online (Sandbox Code Playgroud)

或者在第二个例子中:

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());
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 有两个原因 - 简单和快速失败.您希望代码尽可能简单,如果您确定您的属性不应为null,那么您可能希望代码在遇到null时尽快失败,而是将无效数据传递给该地点并进一步远离该地点引入无效数据的地方. (16认同)
  • 如果o1或o2为null,则返回0; //这一行可能会导致bug,因为返回0意味着它们是相等的. (3认同)

Pau*_*ski 53

从Java 8开始,List接口提供了sort方法.结合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()))
Run Code Online (Sandbox Code Playgroud)

  • 怎么样:`list.sort(Comparator.comparing(MyObject :: getDateTime)` (16认同)
  • 更好的是`list.sort(Comparator.comparing(o - > o.getDateTime()));` (8认同)
  • 为了确保每个人都在同一页面上,像这样的示例:`list.sort(Comparator.comparing(MyObject::getDateTime));`将返回您第一个位置的最早日期,以及第一个位置的最近日期最后的。如果您想要其他方式,只需将其反转即可,如上所示。 (2认同)

hel*_*ios 18

您可以使用Collections.sort方法.这是一种静态方法.你传递它的列表和比较器.它在列表上使用修改后的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;
   }
});
Run Code Online (Sandbox Code Playgroud)

请注意,如果myList属于可比类型(实现Comparable接口的类型)(如Date,Integer或String),则可以省略比较器并使用自然顺序.


Sti*_*Cat 9

list.sort(Comparator.comparing(o -> o.getDateTime()));
Run Code Online (Sandbox Code Playgroud)

来自Tunaki使用Java 8 lambda的最佳答案IMHO


Whi*_*g34 7

假设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;
    }
});
Run Code Online (Sandbox Code Playgroud)


Igo*_*bar 6

我是这样解决的:

Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助。


小智 6

这是我如何实现它的答案:

Mylist.sort(Comparator.comparing(myClass::getStarttime));
Run Code Online (Sandbox Code Playgroud)