如何按指定taxCodes列表顺序对List<Managers>集合进行排序
Java 按指定税务编号顺序排序Managers列表实现方案
核心思路:先构建税务编号到排序权重的映射,税务编号在taxCodes列表中位置越靠前,权重值越小,排序优先级越高。
前置条件
确认Managers类已提供taxCode属性的公共Getter方法:public String getTaxCode()
方案1:生成新的排序后列表(不修改原managers集合,Java 8+适用)
提前将taxCodes转成Map映射提升排序性能,避免每次比较都遍历taxCodes列表:
import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; // 构建taxCode到索引的映射,索引越小排序越靠前 Map<String, Integer> taxCodeOrderMap = IntStream.range(0, taxCodes.size()) .boxed() .collect(Collectors.toMap( taxCodes::get, i -> i, // 若taxCodes存在重复值,保留首次出现的索引 (oldVal, newVal) -> oldVal )); // 排序生成新列表 List<Managers> sortedManagers = managers.stream() // 可选:过滤掉taxCode不在taxCodes列表里的元素 // .filter(manager -> taxCodeOrderMap.containsKey(manager.getTaxCode())) .sorted(Comparator.comparingInt(manager -> // 不在taxCodes列表里的元素默认排在末尾,可根据业务需求调整默认值 taxCodeOrderMap.getOrDefault(manager.getTaxCode(), Integer.MAX_VALUE) )) .collect(Collectors.toList());
方案2:原地排序(直接修改原managers集合的顺序)
Map<String, Integer> taxCodeOrderMap = IntStream.range(0, taxCodes.size()) .boxed() .collect(Collectors.toMap( taxCodes::get, i -> i, (oldVal, newVal) -> oldVal )); managers.sort(Comparator.comparingInt(manager -> taxCodeOrderMap.getOrDefault(manager.getTaxCode(), Integer.MAX_VALUE) ));
性能说明
如果直接在排序规则中调用taxCodes.indexOf(manager.getTaxCode()),每次比较都要遍历一次taxCodes列表,整体时间复杂度为O(n * m * logn)(n为managers长度,m为taxCodes长度);提前转成Map映射后时间复杂度降到O(n + m + n logn),数据量越大性能优势越明显。
内容的提问来源于stack exchange,提问作者Sam Johnson
相关产品推荐
相关产品推荐

