Java中如何按不同升降序规则对列表多字段进行排序
Java多字段组合排序实现方案
假设存储元素的自定义类为MyObj,三个字段a、b、c均已实现Comparable接口(如Integer、String等常用类型默认已实现),以下是两种通用实现方式:
Java 8及以上版本(推荐)
使用JDK自带的Comparator链式API编写,可读性高且不容易出错:
// 核心排序代码 list.sort(Comparator.comparing(MyObj::getA) // 注意:需要单独对b字段的比较器执行反转,不能在整个链式调用末尾加reversed,否则会把前面的排序规则一起反转 .thenComparing(Comparator.comparing(MyObj::getB).reversed()) .thenComparing(MyObj::getC));
你之前降序逻辑不生效大概率是踩了「全局反转」的坑,只有把b字段的比较逻辑单独包裹后反转,才能实现仅b字段降序的效果。
Java 8以下版本
手动实现Comparator接口自定义比较逻辑:
Collections.sort(list, new Comparator<MyObj>() { @Override public int compare(MyObj o1, MyObj o2) { // 第一步:a字段升序比较 int aCompareRes = o1.getA().compareTo(o2.getA()); if (aCompareRes != 0) { return aCompareRes; } // 第二步:a相同则b字段降序比较,交换o1和o2的比较顺序即可实现降序 int bCompareRes = o2.getB().compareTo(o1.getB()); if (bCompareRes != 0) { return bCompareRes; } // 第三步:b也相同则c字段升序比较 return o1.getC().compareTo(o2.getC()); } });
降序逻辑的核心原理:默认compare方法返回负数时o1排在o2前面,升序逻辑下o1属性小于o2时返回负数,要实现降序只需要把比较结果取反,或者交换两个对象的比较顺序即可。
内容的提问来源于stack exchange,提问作者pinux10
相关产品推荐
相关产品推荐

