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

如何使用HashMap实现字符映射替换完成单表替换加密功能

代码问题分析

你的代码存在两处核心逻辑错误:

  • 第一处是映射计数的自增时机错误
    putIfAbsent() 只有当键不存在时才会插入新映射,但你现在的写法是每遍历一个字符就执行一次counter++,即使当前字符已经存在于HashMap中,计数器仍然会无效自增,会导致后续新字符匹配到完全错误的字母表位置。比如输入hello时,第二个l不会插入新映射,但计数器依然会加1,最终o对应的索引就变成了4(实际应该是3,对应d)。
    正确的做法是只有当putIfAbsent()成功插入新映射时,才让计数器自增。

  • 第二处是结果拼接逻辑完全错误
    HashMap的keySet()是无序的,而且你遍历keySet得到的是去重后的字符集合,完全没有保留原输入的字符顺序,自然不可能得到和输入长度一致、顺序对应的加密结果。
    正确的做法是遍历原输入的字符数组,逐个取出HashMap中对应的替换字符,拼接到结果中。

修正后的代码
import java.util.HashMap;

public class Encryption {
    public String encrypt(String message) {
        StringBuilder convertedMessage = new StringBuilder();
        int counter = 0;
        char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();

        HashMap<Character, Character> converter = new HashMap<>();
        String messageholder = message.toLowerCase();
        char[] charMessage = messageholder.toCharArray();

        for (char i : charMessage ) {
            // 只有插入新映射时才自增计数器
            if (converter.putIfAbsent(i, alphabet[counter]) == null) {
                counter++;
            }
        }

        // 遍历原字符数组拼接结果
        for (char c : charMessage) {
            convertedMessage.append(converter.get(c));
        }

        return convertedMessage.toString();
    }
}

测试输入hello会正确输出abccd,符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:06:03