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

如何基于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,符合预期
    }
}

代码细节解释

  1. 计数优化:charCountMap.getOrDefault(c, 0) + 1会自动处理字符不存在的情况(默认给0),比原来的if-else写法更简洁高效。
  2. 排序逻辑:stream().sorted()会把字符按ASCII值从小到大排好,比如p(112)会排在r(114)前面,r又排在s(115)前面。
  3. 相邻对比:遍历的时候只需要到倒数第二个字符(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:54