使用 Comparator.nullsFirst 不适用于 reverse()

Using Comparator.nullsFirst not working with reverse()

提问人:N.A 提问时间:9/26/2023 最后编辑:SörenN.A 更新时间:9/27/2023 访问量:52

问:

我正在尝试按三个值对 Car 进行排序:首先按类型排序,然后在“类型”桶中,我想按价格(从低到最高)对这些值进行排序,然后如果有任何价格相同的值,我想按年龄排序(从最新到最旧)。

但是,有些汽车的价格为零。在这些情况下,我希望所有 null 值都位于列表的末尾。

我正在尝试使用 和 ,但这些都没有做任何事情。我最终首先得到所有的空值(无论我使用哪一个),然后按价格排序的项目。我想知道这是否是因为我有否定 nullsFirst/Last 的?Comparator.nullsFirstComparator.nullsLast.reverse()

这是我正在尝试的:

cars.stream().sorted(Comparator.comparingInt((Car car) -> car.getCarMetadata().getCarType().getPriority())
     .thenComparing((Car car -> car.getCarMetadata().getPrice(), Comparator.nullsLast(Double::compareTo)).reversed()
     .thenComparing((Car car) -> car.getAge).reversed()).collect(Collectors.toList());

对此有什么想法吗?

Java 排序 反向 比较器

评论


答:

1赞 N.A 9/26/2023 #1

刚刚想通了。.移动内部比较最终起作用,如下所示:reversed()

cars.stream().sorted(Comparator.comparingInt((Car car) -> car.getCarMetadata().getCarType().getPriority())
     .thenComparing((Car car -> car.getCarMetadata().getPrice(), Comparator.nullsLast(Double::compareTo)).reversed()
     .thenComparing((Car car) -> car.getAge).reversed()).collect(Collectors.toList());

我不确定我是否完全理解为什么这解决了它。

评论

3赞 Sören 9/26/2023
我看不出两个代码段之间的区别。