You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按字符分组规模优先级对字符串列表进行排序?

解决方案

要实现这种按层级分组规模排序的需求,核心是先预统计所有前缀的出现次数,再基于这些统计结果自定义排序规则。具体实现步骤如下:

1. 预计算所有前缀的计数

遍历所有字符串,生成每个字符串的所有前缀(例如"BYA"会生成"B"、"BY"、"BYA"),用Map统计每个前缀对应的字符串数量。这样后续排序时可以快速获取任意层级前缀的分组规模。

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class HierarchicalSort {
    public static void main(String[] args) {
        List<String> input = Arrays.asList("BYA", "BYB", "BYC", "BXD", "BXE", "ABF", "ABG", "AAH", "CAI");
        
        // 统计所有前缀的出现次数
        Map<String, Long> prefixCount = input.stream()
                .flatMap(s -> {
                    List<String> prefixes = new ArrayList<>();
                    for (int i = 1; i <= s.length(); i++) {
                        prefixes.add(s.substring(0, i));
                    }
                    return prefixes.stream();
                })
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        
        // 自定义层级排序比较器
        Comparator<String> hierarchicalComparator = (s1, s2) -> {
            int minLength = Math.min(s1.length(), s2.length());
            for (int i = 1; i <= minLength; i++) {
                String prefix1 = s1.substring(0, i);
                String prefix2 = s2.substring(0, i);
                long count1 = prefixCount.getOrDefault(prefix1, 0L);
                long count2 = prefixCount.getOrDefault(prefix2, 0L);
                
                // 分组规模大的优先,逆序比较
                int countCompare = Long.compare(count2, count1);
                if (countCompare != 0) {
                    return countCompare;
                }
            }
            // 前缀完全相同时,按字符串长度排序(可按需调整规则)
            return Integer.compare(s1.length(), s2.length());
        };
        
        // 执行排序并输出结果
        input.stream()
                .sorted(hierarchicalComparator)
                .forEach(System.out::println);
    }
}

核心逻辑说明

  • 前缀统计:通过flatMap拆分每个字符串的所有前缀,再用groupingBy配合counting完成统计,确保能快速查询任意层级的分组规模。
  • 层级比较:从首字符开始,逐层对比两个字符串对应前缀的分组规模,规模更大的字符串排在前面;若当前层级规模相同,则继续比较下一层级;若所有共同前缀规模一致,则按字符串长度排序(规则可按需修改)。
  • 兼容性:支持不同长度的字符串排序,无需限定输入字符串长度统一。

问题分析

你之前仅得到首字符分组映射,是因为没有统计全层级的前缀规模,也没有基于这些统计结果构建排序逻辑。要实现层级递进的排序,必须先完成全前缀统计,再在排序时逐层应用规则。

内容的提问来源于stack exchange,提问作者Hervian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:13:15