【问题标题】:Counting character with HashMap使用 HashMap 计算字符
【发布时间】:2021-02-15 22:31:48
【问题描述】:

我正在尝试计算字符串中的所有字符(“Hello”),但代码不起作用。我只是不知道如何让代码做我想做的事。

这就是我尝试的原因:

    char[] array = hello.toCharArray();
    HashMap<Character, Integer> hashMap = new HashMap<>();
    // hashMap.put('a', 1);
    int occurence = 1;
    char currentChar = ' ';

    for (int i = 0; i < array.length; i++) {
        hashMap.put(hello.charAt(i), occurence);
        currentChar = hello.charAt(i);

        for (int j = 0; j < hashMap.size(); j++) {
            if (hashMap.containsKey(currentChar)) {
                hashMap.put(currentChar, occurence + 1);
            }
        }
    }
    System.out.println(hashMap);
}

}

但是,它只打印分配值为 2 的所有字母。

【问题讨论】:

  • 欢迎来到 SO!迭代哈希图(或其大小)是没有意义的——这违背了目的。只需get 一次调用中的键和put 新值,无需j 循环。其次,循环顶部的hashMap.put(hello.charAt(i), occurence); 会覆盖映射中之前的任何值。如果该项目在地图中根本不存在,您只想这样做。
  • 我认为关于如何学习编程或如何调试简单代码的问题更适合Code Review Stack Exchange

标签: java algorithm hashmap character


【解决方案1】:

Java 8 及以上版本带有许多强大的地图变异操作

    Map<Character,Integer> counts = new HashMap<>();

    for (char c : data.toCharArray())
    {
        counts.merge(c, 1, (oldValue,value)-> oldValue+1 );
    }

合并操作要么在映射中创建条目,要么将重映射函数应用于旧值。 v1 是第二个参数的副本,以防重新映射时需要。在你的情况下不是,因为增量是一个常数。

【讨论】:

  • 更惯用的方法是counts.merge(c, 1, Integer::sum)
  • @ArvindKumarAvinash 是的,但只有在初始值和增量相同时才有效。这是因为Integer::sum 将与旧值和merge() 的第二个参数一起应用。这是一个微妙的点,但我可以想象起始值和增量可能不同的情况。在我的版本中它是明确的,而 Integer::sum 对于经验较少的人来说有点“神奇”。
【解决方案2】:

这是一个例子:

String hello = "Hello there";
Map<Character, Integer> count = new HashMap<>();
for (char c : hello.toCharArray()) {
    count.compute(c, (ch, n) -> n == null ? 1 : n.intValue() + 1);
}
System.out.println(count);

它产生

{ =1, r=1, t=1, e=3, h=1, H=1, l=2, o=1}

【讨论】:

    【解决方案3】:

    在您的代码中出现变量未正确处理。

    在您的情况下,单循环就足够了。见下文,您不需要使用额外的变量,只需根据键从地图本身获取现有计数。

    for (int i = 0; i < array.length; i++) {
                char currentChar = hello.charAt(i);
                if(hashMap.containsKey(currentChar)) {
                    hashMap.put(currentChar,hashMap.get(currentChar)+1);
                }else{
                    hashMap.put(currentChar,1);
                }
            }
    

    【讨论】:

    • 谢谢你,它就像一个魅力。现在一切都说得通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    相关资源
    最近更新 更多