如何实现Java List<String[]>按照SQL Order by多列规则排序
Java 实现List<String[]>多列排序(对应SQL Order by Column2、Column4逻辑)
SQL多列排序的核心逻辑是优先按第一排序字段排序,字段值相等时再按第二排序字段排序,注意Java数组下标从0开始,SQL的Column2对应数组下标1,Column4对应数组下标3。
实现思路
- 自定义
Comparator比较器作为排序规则 - 优先比较第2列(数组下标1)的字符串值
- 若第2列值相等,再比较第4列(数组下标3)的字符串值
- Java 8及以上支持链式写法简化代码,也兼容低版本传统写法
完整示例代码
Java 8+ 简洁写法
import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class ListStringArraySort { public static void main(String[] args) { // 构造测试数据,每个String数组长度至少为4,保证存在第2、4列 List<String[]> dataList = new ArrayList<>(); dataList.add(new String[]{"a", "b", "c", "d", "e"}); dataList.add(new String[]{"f", "g", "h", "i", "j"}); dataList.add(new String[]{"k", "b", "m", "a", "n"}); dataList.add(new String[]{"o", "g", "p", "c", "q"}); // 核心排序逻辑:先按第2列升序,再按第4列升序,直接修改原List dataList.sort(Comparator.comparing((String[] arr) -> arr[1]) .thenComparing(arr -> arr[3])); // 如需生成新的排序后List不修改原数据,用stream写法: // List<String[]> sortedList = dataList.stream() // .sorted(Comparator.comparing((String[] arr) -> arr[1]).thenComparing(arr -> arr[3])) // .collect(Collectors.toList()); // 输出验证 for (String[] arr : dataList) { System.out.println(String.join(",", arr)); } } }
输出结果完全符合SQL排序逻辑:
k,b,m,a,n
a,b,c,d,e
o,g,p,c,q
f,g,h,i,j
如果需要调整为降序,直接加Comparator.reverseOrder()即可,比如按第2列升序、第4列降序的写法:
dataList.sort(Comparator.comparing((String[] arr) -> arr[1]) .thenComparing(arr -> arr[3], Comparator.reverseOrder()));
Java 7及以下传统写法
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ListStringArraySortOldVersion { public static void main(String[] args) { List<String[]> dataList = new ArrayList<>(); dataList.add(new String[]{"a", "b", "c", "d", "e"}); dataList.add(new String[]{"f", "g", "h", "i", "j"}); dataList.add(new String[]{"k", "b", "m", "a", "n"}); dataList.add(new String[]{"o", "g", "p", "c", "q"}); // 自定义比较器实现排序 Collections.sort(dataList, new Comparator<String[]>() { @Override public int compare(String[] o1, String[] o2) { // 优先比较第2列 int firstSort = o1[1].compareTo(o2[1]); if (firstSort != 0) { return firstSort; } // 第2列相等时比较第4列 return o1[3].compareTo(o2[3]); } }); // 输出验证 for (String[] arr : dataList) { System.out.println(String.join(",", arr)); } } }
注意事项
- 要保证List中的每个String数组长度不小于4,否则取
arr[3]会触发数组越界异常,若存在长度不足的场景,需要在比较器中提前加长度判断、空值判断逻辑 - 默认是按字符串字典序排序,如果需要按数字、日期等其他类型排序,需要先把对应列的字符串转换为对应类型再比较,比如按第4列的数字排序写法:
.thenComparing(arr -> Integer.parseInt(arr[3]))
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

