【问题标题】:How to reverse comparator order using stream API? [duplicate]如何使用流 API 反转比较器顺序? [复制]
【发布时间】:2017-04-09 19:53:43
【问题描述】:
String obtained = transactions.stream()
    .map(Transaction::getTrader)
    .map(Trader::getName)
    .sorted(String::compareTo)
    .collect(Collectors.joining(","));

如果我想在返回的字符串中反转自然字母顺序而不写特定的Comparator<String>,我该怎么办,以便连接的字符串结果以名称'z..','y..'开头, 'x..' 等等?

【问题讨论】:

    标签: string collections java-8 java-stream comparator


    【解决方案1】:

    在java中,这样的事情可以解决问题:

    String obtained = transactions.stream()
                      .map(Transaction::getTrader).map(Trader::getName)
                      .sorted(Comparator.reverseOrder())
                      .collect(Collectors.joining(","));
    

    请注意,它之所以有效,是因为 String 实现了 Comparable 接口。

    【讨论】:

    • 这就是我所期待的!谢谢,TDRS
    • 我想你的意思是Comparator.reverseOrder()而不是Collection
    【解决方案2】:

    只需一次操作即可对集合进行倒序排序。

    String 实现 Comparable 接口。 java.lang.Comparable#compareTo()javadoc 表示它返回:

    作为此对象的负整数、零或正整数 小于、等于或大于指定对象

    要颠倒收集顺序,您可以:

    1. [推荐] 使用 Comparator.reverseOrder (javadoc) 其中

      返回一个比较器,该比较器对 指定的比较器。 (...)

      List<String> strings = Arrays.asList("a","b","d", "c", "e");
      reversedOrderedStrings = strings.stream()
                                  .sorted(Comparator.reverseOrder())
                                  .collect(Collectors.joining(","));
      
    2. 反转比较参数的顺序

      reversedOrderedStrings = strings.stream()
                                  .sorted((s1, s2) ->  s2.compareTo(s1))
                                  .collect(Collectors.joining(","));
      
    3. [不推荐]更改 compareTo() 方法的符号。不建议这样做,因为它会导致 Integer.MIN_VALUE 的数值溢出

      reversedOrderedStrings = strings.stream()
                                  .sorted((s1, s2) -> -s1.compareTo(s2))
                                  .collect(Collectors.joining(","));
      

    所有的输出都是一样的:

    System.out.println(reversedOrderedStrings);
    e,d,c,b,a
    

    【讨论】:

    • 您是对的,但问题是不要编写自己的比较器。我承认你的方法更快,必须使用。
    • 是的,我知道我能做到,我正在寻找 Collection.reverseOrder() 方法。
    • 我应该在我的答案中使用“sorted(Comparator.reverseOrder())”,如Reverse a comparator in Java 8中所述。
    • @Holger - 更正了答案。感谢您的评论。
    猜你喜欢
    • 2021-12-24
    • 2019-07-15
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2014-04-14
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多