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

问题描述 投票:0回答:5

我正在研究 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 一直告诉我插入;整数之后。有人可以帮我吗?谢谢你

lambda java-8 comparator
5个回答
2
投票

lambda 表达式内的类型定义来自上下文,不需要进一步的类型定义。
您的示例仅使用数组

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]
的相应值(相同索引)与
contests[1]
配对,并将这些数组映射到
contest[1]
值。
排序后将值写回到
forEach
循环中。


1
投票

查看

Arrays.sort(array, comparator)
的文档,您会发现输入数组必须具有 Class 作为类型,因为比较器比较 T 类型的对象。

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

因此,以这种方式对 2D 数组进行排序将需要付出更多努力才能使结构配合。

或者,您可以使用 Streams 来实现您的目标,因为在此过程中会发生自动装箱。这是根据您的要求使用 Streams 和 lambda 的解决方案:

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

可以在这里找到工作示例:https://repl.it/@randycasburn/2D-array-sort


1
投票
Arrays.sort(contests,(int[] num1,int[] num2)->Integer.compare(num2[1],num1[1]));

这对我有用。


1
投票

这是用于对 2d 数组 (n*2) 大小进行排序

int a[][]=new int[n][2];
Arrays.sort(a,(x,y)->x[0]-y[0]);

0
投票
Arrays.sort(contest,(a,b)->{
if(a[0]==b[0]){
return Integer.compare(a[1],b[1]);
}
return Integer.compare(a[0],b[0]);
});
© www.soinside.com 2019 - 2024. All rights reserved.