HashMap为单个键提供多个值

时间:2016-03-01 16:33:01

标签: java collections hashmap

    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不存储重复的密钥。任何人都可以解释一下吗?

4 个答案:

答案 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开始) 。我想你想要计算一个字符串中的不同字符。实际上,它按预期工作。