java - 基于Java中的嵌套值对对象列表进行排序
问题描述
我有一个计划在多个日期交付的汽车列表,需要根据以下几点进行排序:
- 如果
isReady>0,
那么它应该首先显示在表格中。然后其他值在该特定日期低于它。 - If
isReady>0
和 Objectgear!=null
then,它首先显示在该特定日期的表中。其次是 Object 的其他值gear==null
。 - 如果
isReady>0
、 Objectgear!=null
和 Objecttyre!=null
,则该值首先显示在该特定日期的表中。紧随其后的是 Objectgear==null
和tyre==null
.
以下是class
代码:
public class Car {
private int isReady;
private Tyre tyre;
private Gear gear;
private Date deliveryDate;
}
public class Gear {
private int id;
private String type;
}
public class Tyre {
private int id;
private String grip;
}
public class CarComparator implements Comparator<Car> {
@Override
public int compare(Car entry1, Car entry2) {
int value = 0;
if (entry1.getIsReady() > entry2.getIsReady()) {
value = -1;
} else if (entry1.getIsReady() < entry2.getIsReady()) {
value = 1;
} else if (entry1.getIsReady() == entry2.getIsReady()) {
value = 0;
}
return value;
}
}
我开发了一个比较器,它适用于第一个条件 where
isReady>0
. 你能帮我解决上面提到的其他条件吗?
提前致谢。
解决方案
好吧,从 Java 8 开始,您可以像这样构建比较器:
//order by delivery date first, ascending order
Comparator<Car> carComparator = Comparator.comparing( Car::getDeliveryDate )
//order by isReady in ascending order
.thenComparing( Car::getIsReady )
//we map null to 1 and non-null to -1 and ignore the rest for now
.thenComparing( car -> car.getGear() != null ? -1 : 1 )
.thenComparing( car -> car.getTyre() != null ? -1 : 1 );
推荐阅读
- android - 在Android应用程序中检测信标而无需硬编码UUID
- django - 通过 AWS 最大限度地减少用户的延迟
- sql-server - 当年份会改变时,想要两个字段之间的每周差异
- macos - 如何使用 Swift 4 Xcode 10 从 Cocoa 的情节提要中以编程方式设置初始控制器?
- c# - 如何使用 IFileInfo 删除 ASP.NET Core 中的文件
- ember.js - EmberJS:自定义 Ember CLI 构建
- azure-active-directory - 尝试更新“mobilePhone”时 Microsoft Graph API 权限不足
- php - 通过 php 发送带有 .PFX 文件的 Soap 请求
- php - 如何在 Laravel 中插入多封电子邮件?
- c++ - 使用 Glade 和 Webassembly 创建 GUI