Java如何声明Comparator实现二维数组按第二元素升序降序排序
二维数组按第二元素排序实现方法
你现有代码里的lambda表达式本质是Comparator<int[]>接口的简化实现,要切换为按子数组第二个元素排序,只需要将比较逻辑中的数组下标从0改为1即可,以下是具体实现:
与现有写法一致的lambda实现
调用方式和你之前的代码完全兼容,不需要额外定义类:
- 第二元素升序排序
// 比较每个子数组下标为1的元素(即第二个元素),升序排列 Arrays.sort(arr, (a, b) -> Integer.compare(a[1], b[1]));
排序后数组顺序为:{1,2}, {4,2}, {5,3}, {3,7}, {8,9}, {0,90}
- 第二元素降序排序
// 交换比较参数顺序即可实现降序 Arrays.sort(arr, (a, b) -> Integer.compare(b[1], a[1]));
排序后数组顺序为:{0,90}, {8,9}, {3,7}, {5,3}, {1,2}, {4,2}
显式声明Comparator的实现
如果需要单独声明Comparator类、或者要复用比较逻辑,可以用以下两种写法:
方式1:声明Comparator变量(最常用)
直接定义可复用的比较器实例,不需要额外写类文件:
import java.util.Arrays; import java.util.Comparator; // 第二元素升序比较器 Comparator<int[]> secondAsc = new Comparator<int[]>() { @Override public int compare(int[] a, int[] b) { return Integer.compare(a[1], b[1]); } }; // 第二元素降序比较器 Comparator<int[]> secondDesc = new Comparator<int[]>() { @Override public int compare(int[] a, int[] b) { return Integer.compare(b[1], a[1]); } }; // 调用方式和原有逻辑完全一致 Arrays.sort(arr, secondAsc); Arrays.sort(arr, secondDesc);
方式2:定义独立的Comparator实现类
如果需要在多处复用比较逻辑,可以单独定义实现Comparator<int[]>接口的类:
import java.util.Comparator; // 第二元素升序比较器类 class SecondElemAscComparator implements Comparator<int[]> { @Override public int compare(int[] a, int[] b) { // 增加边界校验,避免空指针、数组越界问题 if (a == null || b == null || a.length < 2 || b.length < 2) { throw new IllegalArgumentException("子数组长度不足,无法读取第二个元素"); } return Integer.compare(a[1], b[1]); } } // 第二元素降序比较器类 class SecondElemDescComparator implements Comparator<int[]> { @Override public int compare(int[] a, int[] b) { if (a == null || b == null || a.length < 2 || b.length < 2) { throw new IllegalArgumentException("子数组长度不足,无法读取第二个元素"); } return Integer.compare(b[1], a[1]); } }
调用时直接传入对应类的实例即可:
Arrays.sort(arr, new SecondElemAscComparator());
注意:不要使用a[1] - b[1]的写法做整数比较,当两个元素差值超过int取值范围时会出现整数溢出,导致排序结果错误,使用Integer.compare()是安全的标准写法。
内容的提问来源于stack exchange,提问作者Swastik_8327
相关产品推荐
相关产品推荐

