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

如何在Java中对存储数值的ArrayList的ArrayList进行多关键字排序?

对嵌套ArrayList按指定规则排序的实现方案

针对你需要的先按子列表第一个元素升序,再按第二个元素升序的排序需求,我给你几种在Java中可行的实现方式,涵盖不同版本的语法风格:

1. 初始化测试数据

首先先把你的示例数据用标准Java代码初始化出来:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class NestedArrayListSort {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> arr = new ArrayList<>();
        arr.add(new ArrayList<>(Arrays.asList(1, 0)));
        arr.add(new ArrayList<>(Arrays.asList(0, 3)));
        arr.add(new ArrayList<>(Arrays.asList(2, 1)));
        arr.add(new ArrayList<>(Arrays.asList(2, 2)));
        
        // 排序代码放在这里
    }
}

2. 实现排序的几种方式

方式一:Java 8之前的自定义Comparator(兼容性好)

如果你的项目还在使用Java 8之前的版本,可以用匿名内部类实现Comparator:

Collections.sort(arr, new Comparator<ArrayList<Integer>>() {
    @Override
    public int compare(ArrayList<Integer> list1, ArrayList<Integer> list2) {
        // 先比较子列表的第一个元素
        int firstElementCompare = list1.get(0).compareTo(list2.get(0));
        if (firstElementCompare != 0) {
            return firstElementCompare;
        }
        // 第一个元素相等时,再比较第二个元素
        return list1.get(1).compareTo(list2.get(1));
    }
});

方式二:Java 8+ Lambda表达式(简洁直观)

Java 8及以上版本可以用Lambda简化代码,逻辑和上面完全一致:

Collections.sort(arr, (list1, list2) -> {
    int firstCompare = list1.get(0).compareTo(list2.get(0));
    return firstCompare != 0 ? firstCompare : list1.get(1).compareTo(list2.get(1));
});

方式三:Java 8+ Comparator链式调用(可读性最优)

用Comparator.comparing和thenComparing的链式调用,代码更优雅,一眼就能看出排序规则:

arr.sort(Comparator.comparing((ArrayList<Integer> list) -> list.get(0))
                   .thenComparing(list -> list.get(1)));

如果是Java 10及以上,还可以用var进一步简化类型声明:

arr.sort(Comparator.comparing((var list) -> list.get(0))
                   .thenComparing(list -> list.get(1)));

3. 验证排序结果

排序完成后,遍历打印就能看到你想要的结果:

for (ArrayList<Integer> subList : arr) {
    System.out.print(subList + " ");
}
// 输出:[0, 3] [1, 0] [2, 1] [2, 2]

注意事项

  • 确保所有子列表都至少包含2个元素,否则调用get(0)或get(1)会抛出IndexOutOfBoundsException。如果存在长度不足的子列表,可以在Comparator里先做非空和长度判断。

内容的提问来源于stack exchange,提问作者youssef manyalawy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:02:40