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 类,不要使用Date
和 Calendar
类。
【参考方案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"
。 YYYY
和 DD
的意思有点不同。【参考方案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());
【讨论】:
但我有一个 ListCollections.sort(cars, (Shop shop1, Shop shop2) -> shop1.date.toLowerCase().compareTo(shop2.date.toLowerCase()));
不行,我试过你的解决方案
我已经修改了我的答案——看看它是否适合你。
@JoeydeVilla .toLowerCase()
实际上是不需要的,因为字符串不包含任何字母,只有0123456789:-
根据使用的日期时间格式。以上是关于Java按日期升序排序列表对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章