You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:09:57