You need to enable JavaScript to run this app. Java如何实现按分组规则对指定格式字符串行自定义排序
优惠活动
大模型
产品
解决方案
定价
更多

Java如何实现按分组规则对指定格式字符串行自定义排序

排序功能正确实现方案

现有代码问题

你当前的Comparator拼接逻辑未实现「不同分组对应不同组内排序规则」的要求,仅全局使用了固定的升降序逻辑,无法满足分组首数字为1时组内降序、为0时组内升序的需求。

前置处理步骤

  1. 每行数据解析:每行标准格式为[首数字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值,用于判断组内排序方向
  2. 固定字符串替换:排序完成后统一将所有行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 02:45:10