Java 流排序 2 个变量 ascending/desending
Java stream sort 2 variables ascending/desending
我想对 seq1 进行升序排序,seq2 进行降序排序,所以我这样做了:
list = list.stream().sorted(comparing(AClass::getSeq1).thenComparing(
AClass::getSeq2).reversed()).collect(toList());
但是出来的结果是seq1和seq2都是降序排列的
我可以这样做来使 seq1 升序和 seq2 降序:
sorted(comparing(AClass::getSeq1)
.reversed().thenComparing(AClass::getSeq2).reversed()
真正正确的方法是什么?
在您的第一个示例中,reversed
应用于整个比较器,该比较器按升序比较 seq1 和 seq2。
你需要的是只反转第二个比较,这可以完成,例如:
import static java.util.Collections.reverseOrder;
import static java.util.Comparator.comparing;
list = list.stream().sorted(
comparing(AClass::getSeq1)
.thenComparing(reverseOrder(comparing(AClass::getSeq2))))
.collect(toList());
//or you could also write:
list = list.stream().sorted(
comparing(AClass::getSeq1)
.thenComparing(comparing(AClass::getSeq2).reversed()))
.collect(toList());
代数观察:
在你的第一个例子中:(左结合)
comparing.thenComparing.reversed = (comparing.thenComparing).reversed
在你的第二个例子中:(reversed
的分配)
comparing.reversed.thenComparing.reversed
= ((comparing.reversed).thenComparing).reversed
= ((comparing.reversed.reversed).(thenComparing.reversed))
= (comparing).(thenComparing.reversed)
这是稳定的,仍然总是给你想要的,但绝对不是正确的做法。
(这是注释,但格式太长)
我想对 seq1 进行升序排序,seq2 进行降序排序,所以我这样做了:
list = list.stream().sorted(comparing(AClass::getSeq1).thenComparing(
AClass::getSeq2).reversed()).collect(toList());
但是出来的结果是seq1和seq2都是降序排列的
我可以这样做来使 seq1 升序和 seq2 降序:
sorted(comparing(AClass::getSeq1)
.reversed().thenComparing(AClass::getSeq2).reversed()
真正正确的方法是什么?
在您的第一个示例中,reversed
应用于整个比较器,该比较器按升序比较 seq1 和 seq2。
你需要的是只反转第二个比较,这可以完成,例如:
import static java.util.Collections.reverseOrder;
import static java.util.Comparator.comparing;
list = list.stream().sorted(
comparing(AClass::getSeq1)
.thenComparing(reverseOrder(comparing(AClass::getSeq2))))
.collect(toList());
//or you could also write:
list = list.stream().sorted(
comparing(AClass::getSeq1)
.thenComparing(comparing(AClass::getSeq2).reversed()))
.collect(toList());
代数观察:
在你的第一个例子中:(左结合)
comparing.thenComparing.reversed = (comparing.thenComparing).reversed
在你的第二个例子中:(reversed
的分配)
comparing.reversed.thenComparing.reversed
= ((comparing.reversed).thenComparing).reversed
= ((comparing.reversed.reversed).(thenComparing.reversed))
= (comparing).(thenComparing.reversed)
这是稳定的,仍然总是给你想要的,但绝对不是正确的做法。
(这是注释,但格式太长)