gpt4 book ai didi

java - 流排序问题

转载 作者:行者123 更新时间:2023-12-03 18:42:12 24 4
gpt4 key购买 nike

我有一个项目列表(MyDetail 对象),我想使用流排序方法对其进行排序。该对象有 3 个字段:field1、field2、field3。我想先按 field3 排序,然后是 field2,然后是 field1,所有顺序都相反。所以我写了一个方法sortMyList。

我有一个未排序项目列表 unSortedDetails 如下: myDetail1: "20180201", 假的, 假的 myDetail2: "20180101", 假的, 假的 myDetail3: "20180101", false, true

在 sortMyList(unSortedDetails) 之后,我希望我的结果是 myDetail3、myDetail1、myDetail2,但实际结果是 myDetail1、myDetail3、myDetail2,为什么?

因此,如果我像下面这样为 MyDetail 实现 Comparable,那么它会按预期工作。这太奇怪了。我不知道为什么。谢谢你的帮助!

public List<MyDetail> sortMyList(List<MyDetail> unSortedDetails){
List<MyDetail> myDetails = unSortedDetails
.stream().sorted(Comparator.comparing(MyDetail::getField11).reversed()
.thenComparing(MyDetail::getField2).reversed()
.thenComparing(MyDetail::getField3).reversed())
.collect(Collectors.toList());
return myDetails;
}

@Setter
@Getter
public class MyDetail{
String field1;
Boolean field2;
Boolean field3;
}



@Setter
@Getter
public class MyDetail implement Comparable<MyDetail>{
String field1;
Boolean field2;
Boolean field3;

@Override
public int compareTo(MyDetail o) {
if (this == o || this.equals(o)) return 0;
if (field3) return -1;
if (o.field3) return 1;
if (!field3 && !o.field3 && field2) return -1;
if(!field3 && !o.field3 &&!field2 && o.field2) return 1;
if(!field3 && !o.field3
&&!field2 && !o.field2){
return o.field1.compareTo(field1);
}
return 0;
}
}

最佳答案

您的比较器几乎没有问题。首先,每次调用 reversed() 时,您都会反转比较器的所有 先前设置。

因此您的比较器表示(请参阅注释中的步骤,FieldX 减少为 Fx)

Comparator.comparing(MyDetail::getField11)     //  F1 ASC
.reversed() //~(F1 ASC)
// F1 DESC
.thenComparing(MyDetail::getField2) // F1 DESC, F2 ASC
.reversed() //~(F1 DESC, F2 ASC)
// F1 ASC, F2 DESC
.thenComparing(MyDetail::getField3) // F1 ASC, F2 DESC, F3 ASC
.reversed() //~(F1 ASC, F2 DESC, F3 ASC)
// F1 DESC, F2 ASC, F3 DESC

因此您最终得到的顺序是 Field1 DESC、Field2 ASC、Field3 DESC

要为每个字段指定反向顺序,请通过传递该字段的已反向比较器,如 .thenComparing(Comparator.comparing(YourClass::getField) .reversed()).


下一个问题是比较器使用的字段顺序。在你的问题中你说:

I want to sort by field3 first then field2 then field1

但您的比较器首先检查 field1,然后是 field2,然后是 field3(因为您按此顺序通过 .thenComparing 添加了它们)。

你的代码应该更像

Comparator.comparing(MyDetail::getField13).reversed()
.thenComparing(Comparator.comparing(MyDetail::getField2).reversed())
.thenComparing(Comparator.comparing(MyDetail::getField1).reversed())

因此,您正在创建 ~(F3 ASC)、~(F2 ASC)、~(F1 ASC),结果是 F3 DESC、F2 DESC、F1 DESC


顺便说一句 pointed通过 Holger你可以通过

达到同样的效果
Comparator.comparing(MyDetail::getField3)
.thenComparing(MyDetail::getField2)
.thenComparing(MyDetail::getField1)
.reversed()

请注意 Comparaor.comparing(FunctionToValue)thenComparing(FunctionToValue) 将为所选值创建 ASCending 比较器。

所以前 3 行构造比较器描述顺序 F3 ASC, F2 ASC, F1 ASC。反转之后
~(F3 ASC, F2 ASC, F1 ASC) 也给了我们想要的 F3 DESC, F2 DESC, F1 DESC

关于java - 流排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54658844/

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