gpt4 book ai didi

java - 按字段对对象列表进行排序,如果为空,则按另一个字段排序

转载 作者:行者123 更新时间:2023-12-02 02:56:07 28 4
gpt4 key购买 nike

我有一个对象列表,DealPortafoglio。该对象具有三个字段:keySum1、keySum2 和 key。我想按 keySum1 对列表进行排序,如果它为空,则按 keySum2 排序。我如何使用 Comparable 接口(interface)来做到这一点?预先感谢您

目前,我发现的唯一方法是将列表拆分为两个列表(一个列表的 keySum1 != null,另一个列表的 keySum1=null 和 keySum2 != null),然后独立对它们进行排序。

最佳答案

您可以将 Comparator.nullsLast()Comparator.thenComparing() 结合使用。

例如

@Data
class MyObject {
private String field1;
private String field2;
private String field3;
}

您可以像这样创建一个比较器:

Comparator<MyObject> combined =
Comparator.comparing(MyObject::getField1, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(MyObject::getField2, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(MyObject::getField3, Comparator.nullsLast(Comparator.naturalOrder()));

这将产生一个首先按 field1 排序的 Comparator;如果比较对象之一包含 null,则该对象将排在另一个对象之后 (nullsLast)。如果两个对象的字段均为 null,则将评估下一个字段 (thenComparing()),直到到达 field3

您当然可以创建一个辅助方法

private static Comparator<MyObject> compareField(Function<MyObject, String> fieldExtractor) {
return Comparator.comparing(fieldExtractor, Comparator.nullsLast(Comparator.naturalOrder()));
}

所以你的组合比较器定义更短:

Comparator<MyObject> combined =
compareField(MyObject::getField1)
.thenComparing(compareField(MyObject::getField2))
.thenComparing(compareField(MyObject::getField3));

关于java - 按字段对对象列表进行排序,如果为空,则按另一个字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073231/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com