没有找到适合的方法进行排序。

huangapple go评论73阅读模式
英文:

No suitable method found for sort

问题

我遇到了一个奇怪的Java编译器问题

以下是代码

public int[] findRightInterval(int[][] intervals) {
  int n = intervals.length;
  int[] intIdx = new int[n];
  for(int i=0; i<n; i++) {
     intIdx[i] = i;
  }
  Arrays.sort(intIdx, (a, b) -> (intervals[a][0] - intervals[b][0]));
  ...
}

完整错误信息为

第8行:错误:没有找到适合的方法来对
sort(int[],(a,b)->(in[...]][0]))
        Arrays.sort(intIdx, (a, b) -> (intervals[a][0] - intervals[b][0]));
              ^
    方法 Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) 不适用
      (类型推断变量 T#1 具有不兼容的边界
        相等性约束:int
        下界:Object)
    方法 Arrays.<T#2>sort(T#2[],int,int,Comparator<? super T#2>) 不适用
      (无法推断类型变量 T#2
        (实际参数列表与形式参数列表的长度不同))   其中 T#1、T#2 是类型变量:
    T#1 扩展自Object,在方法 <T#1>sort(T#1[],Comparator<? super T#1>) 中声明
    T#2 扩展自Object,在方法 <T#2>sort(T#2[],int,int,Comparator<? super T#2>) 中声明

另一方面,
如果我将 Arrays.sort(intIdx, (a, b) -> (intervals[a][0] - intervals[b][0])); 替换为 Arrays.sort(intervals, (a, b) -> (a[0] - b[0])); 就能正常工作。

想知道为什么编译器会抛出这个错误?

英文:

I run into a strange Java compiler issue

Here is the code

public int[] findRightInterval(int[][] intervals) {
  int n = intervals.length;
  int[] intIdx = new int[n];
  for(int i=0;i&lt;n;i++) {
     intIdx[i]=i;
  }
  Arrays.sort(intIdx, (a, b) -&gt; (intervals[a][0]-intervals[b][0]));
  ...
}

The full error is

Line 8: error: no suitable method found for
sort(int[],(a,b)-&gt;(in[...]][0]))
        Arrays.sort(intIdx, (a, b) -&gt; (intervals[a][0]-intervals[b][0]));
              ^
    method Arrays.&lt;T#1&gt;sort(T#1[],Comparator&lt;? super T#1&gt;) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: int
        lower bounds: Object)
    method Arrays.&lt;T#2&gt;sort(T#2[],int,int,Comparator&lt;? super T#2&gt;) 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 &lt;T#1&gt;sort(T#1[],Comparator&lt;? super T#1&gt;)
    T#2 extends Object declared in method &lt;T#2&gt;sort(T#2[],int,int,Comparator&lt;? super T#2&gt;)

On the other hand,
if I replace Arrays.sort(intIdx, (a, b) -&gt; (intervals[a][0]-intervals[b][0])); with Arrays.sort(intervals, (a, b) -&gt; (a[0]-b[0])); it works fine.

Wonder why the compiler throw that error?

答案1

得分: 1

public static <T> void Arrays.sort(T[] a, Comparator<? super T> c)

无法使用比较器对 `int[]` 数组进行排序只能用 `Integer[]`。因此您的代码片段可以这样重写

Arrays.sort(Arrays.stream(intIdx).boxed().toArray(), (a, b) -> intervals[a][0] - intervals[b][0]);

***附注** 我建议您在示例中使用 `Stream`:*

intIdx = Arrays.stream(intIdx)
               .boxed()
               .sorted(Comparator.comparingInt(a -> intervals[a][0]))
               .mapToInt(i -> i)
               .toArray();
英文:
public static &lt;T&gt; void Arrays.sort(T[] a, Comparator&lt;? super T&gt; c)

You can't sort int[] array with comparator. Only Integer[]. So, your snippet could be rewritten with:

Arrays.sort(Arrays.stream(intIdx).boxed().toArray(), (a, b) -&gt; intervals[a][0] - intervals[b][0]);

P.S. I reccoment you to use Stream for your example:

intIdx = Arrays.stream(intIdx)
               .boxed()
               .sorted(Comparator.comparingInt(a -&gt; intervals[a][0]))
               .mapToInt(i -&gt; i)
               .toArray();

答案2

得分: -1

你可以导入内置的 Collections 类;

然后写入以下代码:Collections.sort(array);

英文:

you can import the built-in class Collections;

and write this:Collections.sort(array);

huangapple
  • 本文由 发表于 2020年9月19日 05:50:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/63963247.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定