问题

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

我的ArrayList包含其中一个datamembers是DateTime对象的对象。在DateTime上我可以调用函数:

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

所以要比较我可以做类似的事情:

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

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


#1 热门回答(334 赞)

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

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时,上述方法才有效。处理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 热门回答(31 赞)

自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()))

#3 热门回答(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;
   }
});

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


原文链接