Java如何实现按分组规则对指定格式字符串行自定义排序
排序功能正确实现方案
现有代码问题
你当前的Comparator拼接逻辑未实现「不同分组对应不同组内排序规则」的要求,仅全局使用了固定的升降序逻辑,无法满足分组首数字为1时组内降序、为0时组内升序的需求。
前置处理步骤
- 每行数据解析:每行标准格式为
[首数字0/1]-Y-YYY-[地址段],解析出三个核心字段:- 分组键:首数字 + 地址段第一个点之前的数字拼接而成,例如
0-Y-YYY-100.55.22.D的分组键为0_100,0-Y-YYY-101.55.23.E的分组键为0_101,保证同组数据归类正确 - 组内排序键:取地址段最后两部分拼接,例如
100.55.23.21的排序键为23_21,100.55.24.A的排序键为24_A,如需要数字优先级高于字母,可单独增加权重处理 - 首数字标识:行首的0/1值,用于判断组内排序方向
- 分组键:首数字 + 地址段第一个点之前的数字拼接而成,例如
- 固定字符串替换:排序完成后统一将所有行的
Y-YYY替换为A-ABC即可匹配预期输出的前缀格式。
正确Comparator实现(Java示例)
// 首先定义解析后的数据实体类 record LineItem( // 分组键 String groupKey, // 行首0/1标识 int firstFlag, // 组内排序键 String innerSortKey, // 原始行内容用于输出 String originalLine ) {} // 构建符合需求的比较器 Comparator<LineItem> sorter = Comparator // 第一层排序:按分组键排序,保证同组数据连续排列 .comparing(LineItem::groupKey) // 第二层排序:同组内根据首数字判断排序方向 .thenComparing((item1, item2) -> { if (item1.firstFlag() == 1) { // 首数字为1,组内按排序键降序排列 return item2.innerSortKey().compareTo(item1.innerSortKey()); } else { // 首数字为0,组内按排序键升序排列 return item1.innerSortKey().compareTo(item2.innerSortKey()); } });
可选优化
如果最后两段存在数字和字母混合的场景,需要避免22字典序大于100的问题,可在解析innerSortKey时优先将分段转为整数比较,无法转为整数的场景再用字典序比较即可。
内容的提问来源于stack exchange,提问作者dolphin trendz
相关产品推荐
相关产品推荐

