如何按字符分组规模优先级对字符串列表进行排序?
解决方案
要实现这种按层级分组规模排序的需求,核心是先预统计所有前缀的出现次数,再基于这些统计结果自定义排序规则。具体实现步骤如下:
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
相关产品推荐
相关产品推荐

