【问题标题】:Java List sort by one field and then by some specific value [duplicate]Java List 按一个字段排序,然后按某个特定值排序[重复]
【发布时间】:2021-03-17 12:23:04
【问题描述】:

我有一个清单:

List<A> aList

where A:
public class A{
private Long id;

private LocalDate created;

private AStatus status; //enum

...other fields
}
public enum AStatus{
    NEW, SEND, WAITING, CANCELLED
}

如何按 DESC 顺序按 created 对我的列表进行排序,然后我希望将状态为 NEW 的元素作为第一个(然后是其他 AStatus 的元素),例如:

1 10.12.2020 NEW
2 10.12.2020 SEND
3 10.12.2020 CANCELLED
4 08.12.2020 NEW
5 08.12.2020 NEW

【问题讨论】:

  • 如果我们有例如。 3 行具有相同的日期,然后状态 NEW 必须始终位于列表的顶部(作为 FIRST,在同一日期的其他 AStatus 之前)

标签: java list sorting


【解决方案1】:

您可以创建一个自定义的Comparator,它按created 排序,然后按status == AStatus.NEW 的布尔值排序(记住-false 在排序布尔值时位于true 之前):

List<A> aList = // something...
    
// I assume these getters exist
aList.sort(Comparator.comparing(A::getCreated).reversed() 
                     .thenComparing(a -> a.getStatus() != AStatus.NEW)
);

【讨论】:

  • 还有一件事 - 创建的必须按 DESC 顺序...啊...我可能必须使用 reverse() 方法
  • @Matley 没有注意到这个要求,我的错。您可以在此处添加reversed() 呼叫以反转顺序 - 请参阅我编辑的答案
  • 如果这是比较这些 A 类型对象的自然方式,那么另一种很酷的方法是将 Comparable 接口添加到您的类中,并将逻辑保留在类内部而不是外部。然后你将只使用 list.sort();
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多