使用比较器接口和lambda表达式对整数数组进行排序

时间:2019-06-28 21:33:02

标签: java lambda

我正在尝试通过使用lambda表达式实现Comparator接口的compare方法来对整数数组进行排序。我无法理解编译器给出的错误。请帮忙。

我尝试执行以下代码:

import java.util.Arrays;
public class MyClass{ 
    public static void main(String args[]) {

     int[] arr = {5,3,7,8,1,4,6,9};

    Arrays.sort(arr, (int o1, int o2) -> o1 - o2);

     System.out.println(Arrays.toString(arr));
}
}

实际结果:-

/MyClass.java:9: error: no suitable method found for sort(int[],(int o1, i[...] - o2)
    Arrays.sort(arr, (int o1, int o2) -> o1 - o2);
          ^
    method Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) is not applicable
      (inference variable T#2 has incompatible bounds
        equality constraints: int
        upper bounds: Object)
    method Arrays.<T#3>sort(T#3[],int,int,Comparator<? super T#3>) is not applicable
      (cannot infer type-variable(s) T#3
        (actual and formal argument lists differ in length))
  where T#1,T#2,T#3 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 interface Comparator
    T#3 extends Object declared in method <T#3>sort(T#3[],int,int,Comparator<? super T#3>)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

预期:-

排序数组:

[1,3,4,5,6,7,8,9] 

5 个答案:

答案 0 :(得分:5)

没有Arrays::sort的覆盖将原始数组和lambda作为参数的覆盖。

答案 1 :(得分:1)

您将需要使用Integer []数组与Comparator进行排序。采用int []数组的sort方法不支持传递Comparator。

Integer[] arr = {5, 3, 7, 8, 1, 4, 6, 9};

Arrays.sort(arr, (Integer o1, Integer o2) -> o1 - o2);

答案 2 :(得分:1)

Arrays类为primitives提供排序,因此不需要Comparator。这就是为什么您不能指定一个作为参数的原因。当然,这也意味着您仅限于按ascending顺序进行排序。

要以相反或降序对int数组进行排序,可以执行以下操作:

           // convert to stream
           arr = Arrays.stream(arr)

           // wrap it in an Integer object
          .boxed()

           // sort it with specified Comparator
          .sorted(Comparator.reverseOrder())

           // "unbox" it (convert from Integer to int)                            
          .mapToInt(Integer::intValue)

           // and return them in an array
          .toArray();

或者您可以仅从Integer数组开始并执行此操作。

          Integer[] intArr = { 5, 2, 3, 7, 8, 1, 4, 6, 9
          };

          Arrays.sort(intArr,Comparator.reverseOrder());

答案 3 :(得分:0)

为什么要完全使用 Arrays.sort()

index = 0; // declared as class variable
int[] arr = { 5, 3, 7, 8, 1, 4, 6, 9 };

lambda重用旧数组:

IntStream.range( 0, arr.length ).boxed().map( i -> arr[i] )
  .sorted( (i1, i2) -> Integer.compare( i1, i2 ) ).forEach( i -> arr[index++] = i );  // arr == [1, 3, 4, 5, 6, 7, 8, 9]


…对于自然排序顺序,甚至不需要装箱:

IntStream.range( 0, arr.length ).map( i -> arr[i] )
  .sorted().forEach( i -> arr[index++] = i );  // arr == [1, 3, 4, 5, 6, 7, 8, 9]


两种解决方案都将数组内容映射到其相应的索引。选择此构造是因为生成的流具有将比较器作为参数的sort()函数。
排序后,这些值将写回到arr循环中的forEach

答案 4 :(得分:0)

对于 jdk15。 对于原始类型,Arrays.sort 为您提供了一种快速排序的变体,它是升序的并且是固定的。您不能填写比较器。如果要按降序对数组进行排序,则必须编写丑陋的代码才能完成。这就是我个人不喜欢 java 的原因,它有时会使事情变得复杂。

对于引用类型,Arrays.sort 使用 Timsort,您可以填写一个比较器来自定义它。