如何使用lambda表达式编写比较器基于第二列对二维数组排序

如何使用lambda表达式编写比较器基于第二列对二维数组排序,lambda,java-8,comparator,Lambda,Java 8,Comparator,我正在用Java处理一个排序2D数组问题。我想根据每行中的第二列对数组进行排序,例如[I][1]。我试图编写一个lambda表达式,将其放入array.sort(一个,comparator)中,以避免编写整个类 以下是我尝试过的: Arrays.sort(contests, (int[] num1, int[] num2) -> Integer number1 = num1[1]; Integer number2 = num2[1]; return number2.compa

我正在用Java处理一个排序2D数组问题。我想根据每行中的第二列对数组进行排序,例如[I][1]。我试图编写一个lambda表达式,将其放入array.sort(一个,comparator)中,以避免编写整个类

以下是我尝试过的:

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

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

lambda表达式中的类型定义来自上下文,不需要进一步的类型定义。
您的示例仅处理数组
竞赛[1]
中的值
Arrays.sort()需要一维数组。
如果
竞赛
定义为
整数[][]数组
,则此表达式适用于您:

Arrays.sort(竞赛[1],(num1,num2)->(num2.compareTo(num1))


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

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

查看文档发现输入数组必须有一个类作为类型,因为比较器比较类型T的对象

public static <T> void sort(T[] a, Comparator<? super T> c)
可在此处找到工作示例:


这对我很有用。

你必须用
{}
包装你的羔羊的身体。您对单行语句使用简化的lambda语法,但实际上有3行代码。非常感谢!!太糟糕了,我没有足够的声誉来支持你的回答。请稍等,我支持你的问题。顺便说一下,如果你愿意,你可以随时“接受”我的答案。
public static <T> void sort(T[] a, Comparator<? super T> c)
int[][] contests = { { 1, 7 }, { 2, 5 }, { 3, 2 }, { 4, 3 } };
Arrays
  .stream(contests)
  .sorted((a1, a2) -> a1[1] - a2[1])
  .forEach(a -> System.out.println(Arrays.toString(a)));
Arrays.sort(contests,(int[] num1,int[] num2)->Integer.compare(num2[1],num1[1]));