Java 用HashMap计算字符数

Java 用HashMap计算字符数,java,algorithm,hashmap,character,Java,Algorithm,Hashmap,Character,我试图计算字符串中的所有字符(“Hello”),但代码不起作用。我只是不知道如何让代码做我想做的 以下是我尝试的原因: char[] array = hello.toCharArray(); HashMap<Character, Integer> hashMap = new HashMap<>(); // hashMap.put('a', 1); int occurence = 1; char currentChar = ' ';

我试图计算字符串中的所有字符(“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);
}
char[]array=hello.toCharArray();
HashMap HashMap=新的HashMap();
//hashMap.put('a',1);
int发生率=1;
charcurrentchar='';
for(int i=0;i
}


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

代码中的occurence变量处理不正确

在您的情况下,单循环应该足够了。如下所示,您不需要使用额外的变量,只需根据键从映射本身获取现有计数即可

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);
            }
        }
for(int i=0;i
Java版本8及更高版本提供了许多强大的映射变异操作

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

    for (char c : data.toCharArray())
    {
        counts.merge(c, 1, (oldValue,value)-> oldValue+1 );
    }
Map counts=newhashmap();
for(char c:data.toCharArray())
{
合并(c,1,(oldValue,value)->oldValue+1);
}
合并操作要么在映射中创建条目,要么将重新映射函数应用于旧值
v1
是第二个参数的副本,以防在重新映射中需要该参数。在您的情况下不是,因为增量是一个常量。

以下是一个示例:

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);

欢迎来到SO!迭代hashmap(或其大小)没有任何意义——这违背了目的。只需
在一次调用中获取
键并
放入
新值,无需
j
循环。其次,
hashMap.put(hello.charAt(i),occurrence)覆盖映射中以前的值。你只想在地图中根本不存在该项的情况下执行此操作。在我看来,有关如何学习编程或如何调试简单代码的问题更适合于此。更惯用的方法是
counts.merge(c,1,Integer::sum)
@ArvindKumarAvinash是,但只有当初始值和增量相同时,这才有效。这是因为
Integer::sum
将与旧值和
merge()
的第二个参数一起应用。这是一个微妙的点,但我可以想象的情况下,开始值和增量可能不一样。在我的版本中,它是显式的,而在
Integer::sum
中,对于经验较少的人来说,它有点“魔力”。谢谢,它就像一个符咒。现在一切都有了意义。
{ =1, r=1, t=1, e=3, h=1, H=1, l=2, o=1}