【问题标题】:Java sort list object by date ascending [duplicate]Java按日期升序排序列表对象[重复]
【发布时间】:2017-09-11 14:33:40
【问题描述】:

我想按一个参数对我的对象列表进行排序,它是日期,格式为“YYYY-MM-DD HH:mm”,按升序排列。我找不到正确的解决方案。在 python 中使用 lambda 很容易对其进行排序,但在 Java 中我遇到了问题。

for (Shop car : cars) {
             Collections.sort(cars, new Comparator<Shop>() {
                @Override
                public int compare(final Shop car, final Shop car) {
                    return car.getDate().compareTo(arc.getDate());
            }
        });

提前致谢!

【问题讨论】:

  • 是该类型的日期还是字符串?如果是日期,您使用哪个 java 对象?
  • 是那种类型的字符串
  • 显示一些您尝试过的实际代码。这是Java 8吗?如果不是,那非常重要。
  • 我只列出了 myOwnClass 的数据对象,并使用了 Collection.sort(thatList);
  • 提示:只使用 java.time 类,不要使用 DateCalendar 类。

标签: java sorting


【解决方案1】:

公共布尔值之前(日期)

当且仅当此日期表示的时间瞬间为真 对象严格早于 when 表示的瞬间;错误的 否则。

更多信息请参考 java 文档https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#before-java.util.Date-

或者您可以使用日期类中的 after 方法代替 before

package com.stackoverflow.DataSortReverse;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

class Car{
    private String name;
    private Date date;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public Car(String name, Date date) {
        super();
        this.name = name;
        this.date = date;
    }
    @Override
    public String toString() {
        return "Car [date=" + date + "]";
    }
}

public class DateSort {

    public static void main(String[] args) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        List<Car> carList = new ArrayList<Car>();
        try {
            carList.add(new Car("car1",dateFormat.parse("2017-01-10")));
            carList.add(new Car("car1",dateFormat.parse("2017-02-10")));
            carList.add(new Car("car1",dateFormat.parse("2017-02-30")));
            carList.add(new Car("car1",dateFormat.parse("2017-01-09")));
        } catch (ParseException e) {
            System.out.println(e.getMessage());
        }
        /*
         * if you wish to change sorting order just 
         * replace -1 with 1 and 1 with -1
         * 
         * 
         * date1.before(date2)  returns true when date1 comes before date2 
         * in calendar
         * 
         * java docs :: https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#before-java.util.Date-
         * */
        Collections.sort(carList, new Comparator<Car>() {
            @Override
            public int compare(Car o1, Car o2) {
                if(o1.getDate().before(o2.getDate())){
                    return -1;
                }
                return 1;
            }
        });
        System.out.println(carList);
    }

}

【讨论】:

    【解决方案2】:

    你可以试试。我认为它会起作用:

    SimpleDateFormat f = new SimpleDateFormat("YYYY-MM-DD HH:mm");
            Stream<Date> sorted = l.stream().map(a->{
                try {
                    return f.parse(a);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }).sorted();
    

    更新: 如果你想要一个列表:

    List sorted = l.stream().map(a->{
                try {
                    return f.parse(a);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }).sorted().collect(Collectors.toList());
    

    已更新:(作为使用“汽车”更新的问题)

    SimpleDateFormat f = new SimpleDateFormat("YYYY-MM-DD HH:mm");
            List<Car> sorted = cars.stream().sorted(
                    (a,b)->
            {
                try {
                    return f.parse(a.getDate()).compareTo(f.parse(b.getDate()));
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return 0;
            }
            ).collect(Collectors.toList());
    

    【讨论】:

    • 如果没有 ParseException...:|但是它扔了它,所以我们必须处理它
    • 我必须把我的对象列表放在哪里,是这个 L(小写)吗?
    • 我为您的“汽车”列表实现了它
    • 它的工作原理谢谢!!!!
    【解决方案3】:

    如果您使用的是 java 8:

     DateTimeFormatter fm = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
     objects.sort((o1, o2) -> LocalDateTime.parse(o1.getDateStr(), fm)
                        .compareTo(LocalDateTime.parse(o2.getDateStr(), fm)));
    

    还有 java 7:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    Collections.sort(objects, new Comparator<YourObjectType>() {
                public int compare(YourObjectType o1, YourObjectType o2) {
                    try {
                        return df.parse(o1.getDateStr()).compareTo(df.parse(o2.getDateStr()));
                    } catch(ParseException pe) {
                        // handle the way you want...
                    }
            }
        });
    

    【讨论】:

      【解决方案4】:

      没有ParseException的干净解决方案:

      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
      list.sort(Comparator.comparing(shop -> LocalDateTime.parse(shop.getDate(), formatter)));
      

      【讨论】:

      • 它向我显示一个错误:线程“main”java.time.format.DateTimeParseException 中的异常:无法解析文本“2017-04-02”:无法从 TemporalAccessor 获取 LocalDateTime:{} ,ISO 解析为 java.time.format.Parsed 类型的 2017-04-02
      • 所以没有异常更好,但不是没有异常处理:D
      • @stackish 我认为,这是因为您的某些日期不包含时间部分(例如 2017-04-02 而不是 2017-04-02 12:00)。
      • 我已将所有日期更改为“YYYY-MM-DD”的格式,没有小时,但仍然给我例外
      • @stackish 使用"yyyy-MM-dd"YYYYDD 的意思有点不同。
      【解决方案5】:

      我的解决方案的修订版。如果定义如下比较器类...

      class ShopDateComparator implements Comparator<Shop> {
        @Override
        public int compare(Shop shop1, Shop shop2) {
          return shop1.getDate().toLowerCase().compareTo(shop2.getDate().toLowerCase());
        }
      }
      

      ...那么您需要对cars 进行排序(我假设它是Shop 类型的对象列表)是:

      Collections.sort(cars, new ShopDateComparator());
      

      【讨论】:

      • 但我有一个 List cars ,里面有一个日期,格式为“YYYY-MM-DD”的字符串,我想按这个日期排序跨度>
      • 我的回答只是一个指南,特定于您的代码的解决方案将非常相似:Collections.sort(cars, (Shop shop1, Shop shop2) -&gt; shop1.date.toLowerCase().compareTo(shop2.date.toLowerCase()));
      • 不行,我试过你的解决方案
      • 我已经修改了我的答案——看看它是否适合你。
      • @JoeydeVilla .toLowerCase() 实际上是不需要的,因为字符串不包含任何字母,只有0123456789:- 根据使用的日期时间格式。
      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2017-05-21
      • 2011-11-22
      • 2018-06-14
      相关资源
      最近更新 更多