Java如何按指定字段实现非字母序的自定义排序与分组
实现逻辑:给每个action类型分配对应优先级数值,数值越小排序越靠前,按照优先级数值升序即可实现要求的顺序,以下是两种常用实现方案:
前提准备
首先为MyClass的action字段添加getter方法:
public String getAction() { return this.action; }
方案1:Java 8+ 简洁实现(推荐)
使用优先级映射结合内置Comparator完成排序,可选择生成新列表或者直接修改原列表:
import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; // 定义action优先级映射,数值越小排名越靠前 Map<String, Integer> actionPriority = Map.of( "DELETE", 1, "UPDATE", 2, "ADD", 3 ); // 方式1:生成新的排序后列表,不修改原列表 List<MyClass> sortedList = originalList.stream() .sorted(Comparator.comparingInt(item -> actionPriority.get(item.getAction()))) .collect(Collectors.toList()); // 方式2:直接对原列表排序,无需生成新列表 originalList.sort(Comparator.comparingInt(item -> actionPriority.get(item.getAction())));
如果同类型action需要二次排序(比如按account字段字典序排序),追加排序规则即可:
originalList.sort(Comparator.comparingInt((MyClass item) -> actionPriority.get(item.getAction())) .thenComparing(MyClass::getAccount));
方案2:Java 7及更低版本实现
自定义Comparator完成排序:
import java.util.Collections; import java.util.Comparator; import java.util.List; Comparator<MyClass> actionComparator = new Comparator<MyClass>() { @Override public int compare(MyClass o1, MyClass o2) { int priority1 = getActionPriority(o1.getAction()); int priority2 = getActionPriority(o2.getAction()); return Integer.compare(priority1, priority2); } private int getActionPriority(String action) { if ("DELETE".equals(action)) { return 1; } else if ("UPDATE".equals(action)) { return 2; } else if ("ADD".equals(action)) { return 3; } // 未知action默认排到最后,可根据业务需求调整 return 99; } }; // 对列表排序 Collections.sort(originalList, actionComparator);
内容的提问来源于stack exchange,提问作者Rajesh Kumar
相关产品推荐
相关产品推荐

