【问题标题】:How to translate following comparator into Comparator.comparing?如何将以下比较器转换为 Comparator.comparing?
【发布时间】:2020-04-05 14:07:11
【问题描述】:

我的问题可能不清楚,所以让我举例说明一下:

Arrays.sort(arr, new Comparator<String>(){
    public int compare(String a, String b){
        return (b + a).compareTo(a + b);
    }
});

我想使用 Comparator.comparing。我尝试了以下方法:

Arrays.sort(arr, Comparator.comparing((a, b) -> (b + a).compareTo((String)a + b)));

我收到一个错误 - lamdba 表达式中的返回类型错误。如何解决这个问题?

【问题讨论】:

  • 您不会在此处使用Comparator.comparing,因为comparing 采用了一个将String 元素转换为Comparable 的函数。 comparing 不会让您同时访问这两个元素。

标签: java arrays java-8 comparator


【解决方案1】:

Comparator.comparing 方法需要 keyExtractor 类型为 Function。你只需要一个 lambda 来实现Comparator&lt;String&gt; 接口:

Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));

【讨论】:

    【解决方案2】:

    不可能将其转换为对比较的调用,因为它不是有效的比较器:它不满足比较器契约,您永远不应该将它用作比较器。

    为了证明这一点,Comparator 会将每个字符串都与 "" 进行比较,但并非每个字符串都彼此相等。这违反了传递性。

    【讨论】:

      【解决方案3】:

      正如已经回答的,您的匿名类实现可以缩短为 lambda 表达式:

      Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
      

      如果您坚持使用Comparator.comparing(),请记住它的特定参数不适合您的排序问题。

      • Comparator.comparing(keyExtractor) 根据自然比较方式 (Comparator.naturalOrder) 为某个键返回指定的 Comparator。您的方法没有说明比较什么,而是说明比较如何
      • Comparator.comparing(keyExtractor, keyComparator) 看起来更好一些,因为您可以使用keyComparator 指定如何比较指定的键。您可以使用您的比较逻辑并得出以下结论:

        Arrays.sort(arr, Comparator.comparing(
            Function.identity(),                  // keyExtractor, WHAT is compared
            (a, b) -> (b + a).compareTo(a + b))); // keyComparator, HOW is it compared
        

        这是一个使用 Comparator.comparing 的解决方案,它使用 keyExtractor Function.identity() 返回输入(与 str -&gt; str lambda 表达式相同),因为您仍希望比较字符串,但以不同的方式指定自定义Comparator,因此根据需要对数组进行排序的唯一正确方法是省略keyExtractor的简化版本:

        Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
        

        ...这就是我们最终开始的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        相关资源
        最近更新 更多