【发布时间】:2026-02-02 07:30:01
【问题描述】:
我有一个项目列表(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;
}
}
【问题讨论】:
-
您的
field*字段属于String类型,但您试图在 if 语句中将它们视为boolean条件。 -
哦,对不起,field3, field2 是布尔值,field1 是字符串,已更新
标签: java sorting java-8 java-stream