如何根据卡类型指定顺序重排ArrayList中的银行名称元素
Java 按自定义固定顺序重排银行列表解决方案
核心思路是预先定义好目标优先级顺序,再根据每个元素在优先级列表中的索引排序即可,即使原列表只包含部分银行也不影响排序逻辑,不在目标列表内的元素可自行决定放置位置或直接过滤。
方案1:JDK 8+ 直接排序(代码最简洁,适合小数据量)
先定义固定顺序的基准列表:
// 顺序和你要求的目标顺序完全对应即可 private static final List<String> BANK_ORDER_PRIORITY = Arrays.asList( "Chase", "Citi", "Bank Of America", "Wellsfargo", "American Express" );
排序逻辑:
// 待排序的ArrayList示例 List<String> bankList = new ArrayList<>(Arrays.asList("Wellsfargo", "Chase", "American Express", "Citi")); // 按元素在基准列表的索引升序排列 bankList.sort(Comparator.comparingInt(BANK_ORDER_PRIORITY::indexOf));
如果需要把不在基准列表内的银行放到最后而非最前面,可以调整排序规则:
bankList.sort(Comparator.comparingInt(name -> { int index = BANK_ORDER_PRIORITY.indexOf(name); return index == -1 ? Integer.MAX_VALUE : index; }));
方案2:预存索引Map优化(适合大数据量场景)
如果待排序列表长度较大,indexOf每次O(n)的查找成本会影响性能,可以提前把基准列表的索引存入Map,把查找成本降到O(1):
// 启动时初始化一次即可,无需重复构建 private static final Map<String, Integer> BANK_ORDER_MAP; static { List<String> orderList = Arrays.asList("Chase", "Citi", "Bank Of America", "Wellsfargo", "American Express"); Map<String, Integer> tempMap = new HashMap<>(); for (int i = 0; i < orderList.size(); i++) { tempMap.put(orderList.get(i), i); } BANK_ORDER_MAP = Collections.unmodifiableMap(tempMap); } // 排序逻辑 bankList.sort(Comparator.comparingInt(name -> BANK_ORDER_MAP.getOrDefault(name, Integer.MAX_VALUE)));
额外边界处理
如果需要直接过滤掉不在目标列表内的银行,可以结合Stream实现:
List<String> result = bankList.stream() .filter(BANK_ORDER_MAP::containsKey) .sorted(Comparator.comparingInt(BANK_ORDER_MAP::get)) .collect(Collectors.toList());
提示:如果业务场景中银行名称大小写不固定(比如存在
Bank of America和Bank Of America两种写法),可以在构建索引和查找的时候统一转成大写/小写匹配,避免排序失效。
内容的提问来源于stack exchange,提问作者elkkrover87
相关产品推荐
相关产品推荐

