如何让HashMap恢复为初始值?Wordle类游戏开发问题
解决HashMap频率恢复失败的问题
问题根源
你直接将revert赋值为freq的做法,本质是让两个变量指向同一个HashMap对象。Java中对象赋值传递的是引用而非值拷贝,所以修改freq的内容时,revert的内容也会同步变化——因为它们指向的是内存里的同一个实例。最后把freq再赋值为revert,自然还是那个已经被修改过的对象,根本达不到恢复初始值的效果。
解决方案
要实现恢复初始频率的目的,你需要创建原HashMap的独立副本,而非直接传递引用。以下两种实用方法:
方法1:用拷贝构造方法创建独立副本
在处理猜测逻辑前,先保存原频率Map的独立副本:
// 创建原freq的独立副本,二者互不影响 HashMap<Character, Integer> originalFreq = new HashMap<>(freq);
处理完标识分配逻辑后,通过副本恢复原Map:
// 清空当前freq,再将副本内容全部复制回去 freq.clear(); freq.putAll(originalFreq);
方法2:每次重新生成初始频率Map
更省心的方式是写一个工具方法,从目标单词重新生成频率Map。每次处理猜测前调用该方法获取全新的频率Map,彻底避免引用问题:
// 生成目标单词的字母频率Map private HashMap<Character, Integer> generateWordFreq(String targetWord) { HashMap<Character, Integer> freq = new HashMap<>(); for (char c : targetWord.toCharArray()) { freq.put(c, freq.getOrDefault(c, 0) + 1); } return freq; } // 处理猜测时,直接获取全新的频率Map HashMap<Character, Integer> freq = generateWordFreq("PUPPY"); // 执行标识分配逻辑... // 无需手动恢复,下次处理时重新调用generateWordFreq即可
针对你场景的代码示例
// 初始化目标单词PUPPY的初始频率 HashMap<Character, Integer> freq = new HashMap<>(); freq.put('P', 3); freq.put('U', 1); freq.put('Y', 1); // 保存初始频率的独立副本 HashMap<Character, Integer> originalFreq = new HashMap<>(freq); // 处理用户猜测PRUNE的逻辑,修改freq freq.put('P', freq.get('P') - 1); freq.put('U', freq.get('U') - 1); // 此时freq为{P=2, U=0, Y=1} // 恢复初始频率 freq.clear(); freq.putAll(originalFreq); // 现在freq回到{P=3, U=1, Y=1}
内容的提问来源于stack exchange,提问作者CodingNinja
相关产品推荐
相关产品推荐

