Java 按多列中的值对二维数组进行排序

Java 按多列中的值对二维数组进行排序,java,arrays,sorting,multidimensional-array,columnsorting,Java,Arrays,Sorting,Multidimensional Array,Columnsorting,我想用Java构建一个方法,根据给定列中的值对数组进行排序。让我用一个例子(矩阵数组)解释一下: int矩阵[][]={ {0,2,432},{1,1,282},{2,2,456},{3,4,191},{4,5,293}, {5,2,475},{6,2,491},{7,5,171},{8,5,134},{9,3,354}}; 我需要根据第二个位置按降序对每个三元组进行排序。之后,我需要根据第三个位置按递增顺序对三元组进行排序 我使用的代码是: import java.util.*; 公共类so

我想用Java构建一个方法,根据给定列中的值对数组进行排序。让我用一个例子(矩阵数组)解释一下:

int矩阵[][]={
{0,2,432},{1,1,282},{2,2,456},{3,4,191},{4,5,293},
{5,2,475},{6,2,491},{7,5,171},{8,5,134},{9,3,354}};
我需要根据第二个位置按降序对每个三元组进行排序。之后,我需要根据第三个位置按递增顺序对三元组进行排序

我使用的代码是:

import java.util.*;
公共类sort2DMatrixByColumn{
//函数按列排序
公共静态无效排序列(int arr[][],int col){
//使用内置的排序函数array.sort
sort(arr,新的比较器(){
@凌驾
//根据列比较值
公共整数比较(最终整数[]入口1,
最终整数[]入口2){
if(entry1[col]
上述代码的输出为:

[[8,5,134],[7,5,171],[4,5,293],[3,4,191],[9,3,354],
 [6,2,491],[5,2,475],[2,2,456],[0,2,432],[1,1,282]]
但所需的产出必须是:

[[8,5,134],[7,5,171],[4,5,293],[3,4,191],[9,3,354],
 [0,2,432],[2,2,456],[5,2,475],[6,2,491],[1,1,282]]
请注意,根据第二个位置,我们有以下内容:5,5,5,4,3,2,2,1(降序),根据第三个位置,顺序是:134171293(对于第二个位置有“5”的三联体),191(对于第二个位置有“4”的三联体),354(对于第二个位置有“3”的三联体),432456475491(对于第二个位置为“2”的三联体)以及最后282(对于第二个位置为“1”的三联体)

任何帮助都将不胜感激。谢谢。

请尝试以下方法:

int矩阵[][]={
{0, 2, 432}, {1, 1, 282}, {2, 2, 456}, {3, 4, 191}, {4, 5, 293},
{5, 2, 475}, {6, 2, 491}, {7, 5, 171}, {8, 5, 134}, {9, 3, 354}};
比较器秒减=(a,b)->b[1]-a[1];
比较器第三增量=(a,b)->a[2]-b[2];
数组.流(矩阵)
.排序(第二次减少。然后比较(第三次增加))
.forEach->System.out.println(Arrays.toString);

从sortByColumn方法中删除col参数,因为它不是一个真正的参数,并以以下方式更改方法:

//按列排序的函数
公共静态无效排序列(int arr[][]){
//使用内置的排序函数array.sort
sort(arr,新的比较器(){
@凌驾
//根据列比较值
公共整数比较(最终整数[]项1,最终整数[]项2){
if(entry1[1]entry2[1])
返回-1;
return-1*Integer.valueOf(entry2[2])
.compareTo(Integer.valueOf(entry1[2]));
}
});//函数调用结束排序()。
}
当然,将main中的调用更改为
sortbyColumn(矩阵)

说明:

只有在第二列相等的情况下,我们才需要按第三列进行比较(这意味着第一个比较数值结果等于0)。在这种情况下,我们按照相反的顺序进行比较,比较结果乘以
-1

结果:

8 5 134 
7 5 171 
4 5 293 
3 4 191 
9 3 354 
0 2 432 
2 2 456 
5 2 475 
6 2 491 
1 1 282 
您可以使用比较器链接,先按指定顺序按一列,然后按不同顺序按另一列:

int[][]矩阵={
{0, 2, 432}, {1, 1, 282}, {2, 2, 456}, {3, 4, 191}, {4, 5, 293},
{5, 2, 475}, {6, 2, 491}, {7, 5, 171}, {8, 5, 134}, {9, 3, 354}};
//按第二列降序排序,
//然后按升序排列第三列
数组。排序(矩阵、比较器)
// 
.comparing(arr->arr[1],Comparator.reverseOrder())
.然后比较(arr->arr[2],Comparator.naturalOrder());
//输出
Arrays.stream(matrix).map(Arrays::toString).forEach(System.out::println);

另见:

[8, 5, 134]
[7, 5, 171]
[4, 5, 293]
[3, 4, 191]
[9, 3, 354]
[0, 2, 432]
[2, 2, 456]
[5, 2, 475]
[6, 2, 491]
[1, 1, 282]