web-dev-qa-db-ja.com

Javaストリームソート2変数昇順/降順

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()

これを実際に行う正しい方法は何ですか?

19
Bruce

最初の例では、reversedがseq1とseq2を昇順に比較するコンパレータ全体に適用されます。

必要なのは、2番目の比較のみを元に戻すことです。これは、たとえば次のように実行できます。

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());
38
assylias