插入HashMap会改变其他存储HashMap中的值



好的,我被这个难住了,我不知道是什么导致了这个问题。我所遇到的问题发生在一个类中,当给定一个文本文件时,会发现一个字母的实例数在另一个字母之后。我有一个HashMapCharacter HashMap来存储所有这些。哈希的键是文本中包含的所有字符,每个字符对应于一个内部哈希,该内部哈希包含一个字符(内部哈希键)在外部哈希键之后的大小写数。键为'a'的内部散列将包含'b'出现在'a'之后的次数,'c'出现在'a'之后的次数,'z'出现在'a'之后的次数,以此类推,适用于'a'之后的所有字符。mutableint仅保存一个int值,并允许通过方法对其进行自增。

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

currHash.put('~', total);

因此,在分析《战争与和平》时,最后输入的总数是"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中。这就是它们改变的原因——你在每个地方都加了一个计数器,而不是很多。

每次添加相同的 MutableInt对象。您需要为添加到HashMap中的每个字符创建一个新对象。

您正在使用相同的 MuteableInt作为所有散列的值。为什么不直接使用原始的包装器Integer呢?这样,每当你进行更改时,就会创建一个新的整数,而不会修改旧的整数。

考虑更简单的问题,将哈希值a, b, c, d分别设置为1,2,3,4:

使用MuteableInt并在每次插入前修改其值

键(一)→Int值1

键(b)→将原来的int值改为2并链接到它

键(c)→将原来的int值改为3并链接到它

键(d)→将原来的int值改为4并链接到它

所有的键都是4

如果你使用的是Integer,那就是Immutable

集(一)→创建一个值为1

的整型对象

键(b)→create another int

键(c)→创建第三 int与值3

键(d)→创建另一个值为4的 int

正确行为。

最新更新