Java按日期升序排序列表对象[重复]

Posted

技术标签:

【中文标题】Java按日期升序排序列表对象[重复]【英文标题】:Java sort list object by date ascending [duplicate] 【发布时间】: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 类。 【参考方案1】:

公共布尔值之前(日期)

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

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

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

package com.***.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:- 根据使用的日期时间格式。

以上是关于Java按日期升序排序列表对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据GPA对数组列表进行升序排序? arraylist 包含一个对象数组。 (Java)[重复]

从sqlite按日期升序对列表进行排序

在Python 3.4中按日期对字典列表进行排序[重复]

Java排序Arraylist并返回排序列表[重复]

按日期排序对象列表,其中对象没有名称

按特定参数对对象列表进行排序