【问题标题】:Comparing a character array using custom lamda comparator in Java [duplicate]在Java中使用自定义lambda比较器比较字符数组[重复]
【发布时间】:2021-09-23 06:02:08
【问题描述】:

我正在尝试使用 lambda 函数作为比较器在 Java 中使用自定义排序顺序对字符数组进行排序 -

order = "edcba"
char[] arr = {'a','b','c','d','e'}

我正在尝试这段代码:

Arrays.sort(arr, (a,b)->Integer.compare(order.indexOf(a), order.indexOf(b)));

但是,这给了我以下错误-

Line 4: error: no suitable method found for sort(char[],(a,b)->Int[...]f(b)))
        Arrays.sort(arr, (a,b)->Integer.compare(order.indexOf(a), order.indexOf(b)));
              ^
    method Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: char
        lower bounds: Object)
    method Arrays.<T#2>sort(T#2[],int,int,Comparator<? super T#2>) is not applicable
      (cannot infer type-variable(s) T#2
        (actual and formal argument lists differ in length))   where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>sort(T#1[],Comparator<? super T#1>)
    T#2 extends Object declared in method <T#2>sort(T#2[],int,int,Comparator<? super T#2>)

我之前尝试过使用类似的代码来使整数数组成功。有人可以解释我在哪里出错了吗?

【问题讨论】:

  • 这是拳击的问题:Arrays.sort 需要 Comparator&lt;? super T&gt; c,但你的 lambda 被推断为接受原始 chars,而那些不是 Objects。
  • 问题是没有Arrays.sort(char[], Comparator)方法。 sort(T[], Comparator&lt;? super T&gt;) 在这里不适用,因为 T 不能是 char 并且自动装箱在这里不起作用。您需要在此处转换为 Character[]

标签: java sorting lambda comparator


【解决方案1】:

你可以试试这个代码。

String order = "edcba";
char[] arr = {'a', 'b', 'c', 'd', 'e'};

var characters = new String(arr).chars()
        .mapToObj(c -> (char) c)
        .toArray(Character[]::new);

Arrays.sort(characters, 0, arr.length, Comparator.comparingInt(order::indexOf));

for (char ch : characters) {
    System.out.print(ch);
}

解释。 这是排序方法的文档https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Arrays.html#sort(T[],int,int,java.util.Comparator)

第一个问题,您缺少范围(开始和结束)。

第二个问题,该方法接受泛型类型T。因此,您不能将原始数组传递给方法 (char[])。因此,第一步是将char[]转换为Character[],然后使用sort()方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 2018-10-31
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多