java - 插入 HashMap 会更改其他存储的 HashMap 中的值

标签 java

好吧,我被这个问题难住了,我不知道是什么导致了这个问题。我遇到的问题发生在一个类中,当给定一个文本文件时,将找到一个字母接一个字母的实例数。所以我有一个HashMapCharacter,HashMap存储了所有这些。哈希的键是文本中包含的所有字符,每个字符对应一个内部哈希,其中包含外部哈希键之后的字符(内部哈希键)的情况数。具有键“a”的内部哈希将包含“b”在“a”之后出现的次数、“c”在“a”之后出现的次数、“z”在“a”之后出现的次数,因此对于“a”之后的所有字符,依此类推。 MuteableInt 只是保存一个 int 值,并允许它通过方法递增。

当我计算每个内部哈希中包含的所有计数的总和时,会发生错误。我找到总数,然后将其插入到“~”键下。当我插入它时,总数是正确的,但是当我稍后取出总数时,我发现对于每个内部哈希,总数采用我最后输入的总数的值。

currHash.put('~', total);

因此,在分析《 war 与和平》时,最后输入的总数是“x”,其总数为 3987。当我取出“h”或任何其他字符的实例总数时,它也是3987。希望这是有道理的,这是有问题的代码。

public class CountTransitions {

HashMap<Character, HashMap<Character, MuteableInt>> counts;

public void calcTotal() {
Iterator<Character> iterator = counts.keySet().iterator();
        HashMap<Character, MuteableInt> currHash;
        char curr, next;
        MuteableInt total = new MuteableInt(0);
        MuteableInt count = new MuteableInt(0);

        while (iterator.hasNext()) {
            curr = iterator.next();
            currHash = counts.get(curr);
            total.set(0);
            Iterator<Character> innerIt = currHash.keySet().iterator();
            while (innerIt.hasNext()) {
                next = innerIt.next();
                count = currHash.get(next);
                total.add(count);
            }//end while
            System.out.println("Total: " + total);
            currHash.put('~', total);
        }//end while
}
}//end class

最佳答案

您只为 total 创建一个 MuteableInt,并将相同的对象引用放入每个子 HashMap 中。这就是它们发生变化的原因——您在各处增加的只是一个计数器,而不是很多。

关于java - 插入 HashMap 会更改其他存储的 HashMap 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988032/

相关文章:

java - 个人Android应用程序的包名称

java - 如何建立与DVR的连接并解码数据?

java - MySQL datetime NULL 问题, '=' 和 '!=' 返回 0 行

java - 如何在paintComponent()方法之外访问Graphics对象

java - 无法为 Android 中的 java 方法创建 return 语句

java - 二叉搜索树结果中包含 0 (Java)

java - 如何同时比较对象类型和值

java - swing + java中的工具栏问题

java - Android:定位图像?

java - 构造函数采用两个整数,它们不能相等,实现这个的最佳方法是什么?