好的,我被这个难住了,我不知道是什么导致了这个问题。我所遇到的问题发生在一个类中,当给定一个文本文件时,会发现一个字母的实例数在另一个字母之后。我有一个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
正确行为。
…