日期排序 - 最新到最旧

时间:2010-04-09 10:17:07

标签: java date collections

Collections.sort(someList, new Comparator<SomeObject>() {
            public int compare(final SomeObject object1, final SomeObject object2) {
                return (object1.getSomeDate()).compareTo(object2.getSomeDate()); 
            }}
        );

它会给我带有最新日期的对象,这意味着该列表将包含具有最新日期到最早日期的对象集合吗?

6 个答案:

答案 0 :(得分:3)

Comparator.comparing

您可以将method reference传递给Comparator.comparing

如果您希望对象根据日期升序排序:

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

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

按降序排列。

答案 1 :(得分:2)

确保您可以使用:

Collections.sort(someList, new Comparator<SomeObject>() {
        public int compare(final SomeObject object1, final SomeObject object2) {
            return object1.getSomeDate().after(object2.getSomeDate()) ? 1 : -1; 
        }}
);

答案 2 :(得分:1)

Date的默认排序会在较旧的日期之后添加较新的日期,因此最早的日期将位于列表的开头,最新的日期位于结尾。 Comparators在我看来一直很难阅读,所以我转而使用谷歌的Ordering对象来实现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);

此代码创建的订单Comparator将使用Date的自然顺序基于Date对SomeObject对象进行排序。但是Ordering非常好的原因是一些额外的方法改变了顺序而不必编写任何更多的逻辑,例如将日期的顺序反转为最新到最旧,你只需要添加一个调用reverse() :

Ordering<SomeObject> order = Ordering.natural().reverse().onResultOf(new Function<SomeObject, Date>() {
    public Date apply(SomeObject object) {
        return object.getDate();
    }
});

答案 3 :(得分:1)

这是旧的,但可能有人可以使用它。可以使用java8对其进行排序,如下所示:

  someList.sort(Comparator.comparing(listMember::dateProducingMethod))

答案 4 :(得分:0)

通过使用lambdaj,您可以采用更简单,更易读的方式获得相同的结果:

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

远比编写一个模糊不清的内部类更好,不是吗?

答案 5 :(得分:0)

尝试一下:

  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()将日期“转换”为一个较长的日期,以便于比较和排序。

无论如何,都将Longs与之比较:

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