【问题标题】:Java stream sort 2 variables ascending/desendingJava流排序2个变量升序/降序
【发布时间】:2015-08-03 15:15:18
【问题描述】:

我想对 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()

真正正确的方法是什么?

【问题讨论】:

  • 今后,请提供您的import static声明。

标签: java sorting java-8 comparator java-stream


【解决方案1】:

在您的第一个示例中,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());

【讨论】:

  • 哇!解决问题的方法不止一种。谢谢!
  • .thenComparing(AClass::getSeq2, reverseOrder()) 也是可能的,并且将成为源代码长度的赢家(多么接近的匹配)......
  • 感谢您添加import static 语句。他们真的应该在问题中......
  • 是否有可能在 java 7 中实现这种行为?
  • @stackMan10 是的,使用匿名内部类的自定义比较器是肯定的。我相信您可以在 SO 上找到很多关于此的问题。
猜你喜欢
  • 2013-04-24
  • 2021-09-29
  • 2017-03-21
  • 2012-11-08
  • 2023-03-07
  • 2012-12-21
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多