首页 > 解决方案 > 没有找到合适的排序方法

问题描述

我遇到了一个奇怪的 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]));
  ...
}

完整的错误是

Line 8: error: no suitable method found for
sort(int[],(a,b)->(in[...]][0]))
        Arrays.sort(intIdx, (a, b) -> (intervals[a][0]-intervals[b][0]));
              ^
    method Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: int
        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(intIdx, (a, b) -> (intervals[a][0]-intervals[b][0]));它就Arrays.sort(intervals, (a, b) -> (a[0]-b[0]));可以了。

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

标签: javaarrayssorting

解决方案


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]);

PS我建议你使用Stream你的例子:

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

推荐阅读