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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:17