如何基于ASCII顺序比较HashMap中相邻字符的出现次数?
解决你的字符次数相邻比较问题
嘿,你已经搞定了字符出现次数的统计,这部分没问题!现在的核心卡点在于HashMap本身是无序的,没法直接像数组那样做相邻键的比较。不过没关系,我们只需要把字符按ASCII顺序排好队,再逐个对比次数就可以了。
具体步骤拆解
- 第一步:保留你写的计数逻辑,不过可以稍微优化得更简洁点(用
getOrDefault替代if-else,少写点冗余代码)。 - 第二步:把HashMap里的所有字符键提取出来,按ASCII值排序——Character类自带的排序逻辑就是按Unicode(ASCII是它的子集)来的,直接用就行。
- 第三步:遍历排序后的字符列表,挨着对比前一个和后一个字符的出现次数。根据你的示例需求,只要发现ASCII更大的字符次数比前一个(ASCII更小的)多,直接返回false;如果所有相邻对都符合“ASCII大的次数不大于ASCII小的”,最后返回true。
完整可运行代码
import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CharCountChecker { public static boolean checkCountOrder(String str) { Map<Character, Integer> charCountMap = new HashMap<>(); // 统计字符出现次数(优化版) for (char c : str.toCharArray()) { charCountMap.put(c, charCountMap.getOrDefault(c, 0) + 1); } // 把字符按ASCII顺序排序 List<Character> sortedChars = charCountMap.keySet().stream() .sorted() .collect(Collectors.toList()); // 逐个对比相邻字符的次数 for (int i = 0; i < sortedChars.size() - 1; i++) { char currentChar = sortedChars.get(i); char nextChar = sortedChars.get(i + 1); int currentCount = charCountMap.get(currentChar); int nextCount = charCountMap.get(nextChar); // 对应你的示例:如果ASCII更大的字符次数 > 前一个,直接返回false if (nextCount > currentCount) { return false; } } // 所有相邻对都符合要求,返回true return true; } public static void main(String[] args) { // 测试你的示例 System.out.println(checkCountOrder("ssppprr")); // 输出true,符合预期 System.out.println(checkCountOrder("sspprrr")); // 输出false,符合预期 } }
代码细节解释
- 计数优化:
charCountMap.getOrDefault(c, 0) + 1会自动处理字符不存在的情况(默认给0),比原来的if-else写法更简洁高效。 - 排序逻辑:
stream().sorted()会把字符按ASCII值从小到大排好,比如p(112)会排在r(114)前面,r又排在s(115)前面。 - 相邻对比:遍历的时候只需要到倒数第二个字符(
i < sortedChars.size() -1),避免数组越界。对比逻辑完全匹配你的示例:- 对
ssppprr,排序后是p(3)、r(2)、s(2),2<=3且2<=2,所有条件都满足,返回true。 - 对
sspprrr,排序后是p(2)、r(3)、s(2),第一个对比就发现3>2,直接返回false。
- 对
这样就完美解决你的需求啦!
内容的提问来源于stack exchange,提问作者Garrett Witzenburg
相关产品推荐
相关产品推荐

