首页 > 解决方案 > 如何编写比较器以使用 lambda 表达式基于第二列对二维数组进行排序

问题描述

我正在研究 Java 中的排序二维数组问题。我想根据每行中的第二列对数组进行排序,例如 a[i][1]。我正在尝试编写一个 lambda 表达式以将其放入 Arrays.sort(a,comparator) 以避免编写整个类。

这是我尝试过的:

Arrays.sort(contests, (int[] num1, int[] num2) -> Integer number1 = num1[1];
   Integer number2 = num2[1];
    return number2.compareTo(number1);
);

我不确定出了什么问题,因为 Java 在我运行时不会给我一个确切的错误消息。我知道 lambda 表达式的第一部分是输入,第二部分是比较。由于 .compareTo() 仅适用于对象,这就是我创建两个整数的原因。Eclipse 一直告诉我插入;在整数之后。任何人都可以帮助我吗?谢谢

标签: lambdajava-8comparator

解决方案


lambda 表达式中的类型定义来自上下文,不需要进一步的类型定义。
您的示例仅使用 array 中的值contests[1]
Arrays.sort()需要一个一维数组。
如果contests定义为Integer[][] array,那么这个表达式应该适用于你:

Arrays.sort( contests[1], (num1, num2) -> ( num2.compareTo( num1 ) ) );


对对应的两个数组进行排序 -Arrays.sort()将不起作用:

index1 = 0;  // defined as class variable
index2 = 0;  // defined as class variable
Arrays.stream( contests[1] ).map( (n) -> new Integer[] {
    contests[0][index1], contests[1][index1++]
} ).sorted( (arr1,arr2) -> Integer.compare( arr2[1], arr1[1] ) )
.forEach( (arr) -> {
  contests[0][index2] = arr[0];
  contests[1][index2++] = arr[1];
} );

contests[0]一种方法是将with的对应值(相同索引)配对contests[1]并将这些数组映射到contest[1]值。
排序后将值写回forEach循环中。


推荐阅读