好吧,我被这个问题难住了,我不知道是什么导致了这个问题。我遇到的问题发生在一个类中,当给定一个文本文件时,将找到一个字母接一个字母的实例数。所以我有一个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/