如何使用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
相关产品推荐
相关产品推荐

