String inputString = myScan.nextLine();
char[] inp = inputString.toCharArray();
HashMap<Character, Integer> m1 = new HashMap<Character, Integer>();
for (char i : inp) {
if (m1.get(i) != null) {
m1.put(i, m1.get(i) + 1);
} else {
m1.put(i, 0);
}
System.out.println(m1.get('a'));
}
当aaabbbb作为输入传递时。我得到0 1 2 2 2 2 2作为输出.Thats是一个键映射到多个值。虽然我知道HashMap不存储重复的密钥。任何人都可以解释一下吗?
答案 0 :(得分:1)
您没有将'a'
映射到多个值;你将它映射到一个值,整数2
。在m1.put(i, m1.get(i) + 1)
行上,您将覆盖先前存储在m1
中的密钥i
的值。
答案 1 :(得分:1)
您正在编写在循环的每次迭代中到目前为止已计算'a'
的次数。这绝对不是你想要实现的,输出确实是正确的,因为'a'
的频率在前3次迭代中增加1,然后保持在2。
然后另一个错误是,第一次看到一个字符时,你将其频率设置为0,而它应该设置为1.
最后但并非最不重要的是,Java8已经成熟,应该用于简化代码。您可以自动分区频率或至少使用HashMap.compute
:
for (char c : inp)
m1.compute(c, (v, entry) -> entry == null ? 1 : entry + 1);
答案 2 :(得分:0)
您没有公开所有信息来复制您的问题,但对我来说很明显,当您的程序运行时,您将不同的值设置为键“a”,并且这些值正在标准输出中打印,这就是全部,地图存储多次相同的密钥没有任何问题,事实上谷歌多图表就是这样做的。
答案 3 :(得分:0)
你正在打印m1.get(&#39; a&#39;)7次的值 - 这7次中有3次,你正在更新从0开始的值(也许你应该从1开始) 。我想你想要计算一个字符串中的不同字符。实际上,它按预期工作。