如何在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
相关产品推荐
相关产品推荐

