lambda - 如何编写比较器以使用 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 一直告诉我插入;在整数之后。任何人都可以帮助我吗?谢谢
解决方案
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
循环中。
推荐阅读
- linux - Pthreads 程序比串行程序慢 - Linux
- python - 如何将多个sql代码捆绑到一个块中供python运行?
- swift - 如何将 WKScriptMessage.body 转换为结构?
- python - 一个非常基本的示例中的 SVM-OVO 与 SVM-OVA
- c# - ASP.net 如何直观地反转特定的 CheckBox?
- python - 如何在 .txt 文件中搜索字符串并打印字符串所在的行?(Python)
- java - 带有空参数的Spring数据jpa本机查询(PostgreSQL)
- vue.js - 在历史模式下使用 vue-router 删除哈希而不重新加载
- ionic-framework - 我可以在 service-worker 同步上使用 ionic/storage 吗?
- javascript - 尝试使用 JavaScript 添加删除功能,当我单击它时需要删除整个表单。顺便说一句,我正在使用引导程序