如何计算字符串中字符的频率?

Bil*_*ill 29 java string key-value

我需要编写某种循环来计算字符串中每个字母的频率.
例如:"aasjjikkk"将计为2'a',1'',2'j',1'i',3'k'.最终像这样的id最终会出现在一个地图中,其中字符为键,计数为值.有什么好主意怎么做?

小智 33

您可以使用java Map并将a映射charint.然后,您可以遍历字符串中的字符并检查它们是否已添加到地图中,如果有,则可以增加其值.

例如:

HashMap<Character, Integer> map = new HashMap<Character, Integer>();
String s = "aasjjikkk";
for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    Integer val = map.get(c);
    if (val != null) {
        map.put(c, new Integer(val + 1));
    }
    else {
       map.put(c, 1);
   }
}
Run Code Online (Sandbox Code Playgroud)

最后,您将计算您遇到的所有角色,并从中提取频率.

或者,您可以使用Bozho使用Multiset的解决方案并计算总发生次数.

  • 哦,但你不能实例化 Map,它的抽象,仅供参考。 (2认同)

Boz*_*zho 15

您可以使用Multiset(来自番石榴).它会为您提供每个对象的计数.例如:

Multiset<Character> chars = HashMultiset.create();
for (int i = 0; i < string.length(); i++) {
    chars.add(string.charAt(i));
}
Run Code Online (Sandbox Code Playgroud)

然后,对于您可以调用的每个字符chars.count('a'),它将返回出现次数


Sre*_*nth 11

一个简洁的方法是:

Map<Character,Integer> frequencies = new HashMap<>();
for (char ch : input.toCharArray()) 
   frequencies.put(ch, frequencies.getOrDefault(ch, 0) + 1);
Run Code Online (Sandbox Code Playgroud)

我们使用for-each循环遍历每个角色.所述frequencies.getOrDefault()如果键存在或返回(默认)第二个参数得到的值.

  • 更简洁:“frequencies.merge(ch, 1, Integer::sum);”它也不需要两次映射查找。 (2认同)

Ous*_* D. 6

从JDK-8开始使用流API:

Map<Character, Long> frequency =
            str.chars()
               .mapToObj(c -> (char)c)
               .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望键为整数:

Map<Character, Integer> frequency =
            str.chars()
               .mapToObj(c -> (char)c)
               .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(c -> 1)));
Run Code Online (Sandbox Code Playgroud)

另一个变体:

Map<Character, Integer> frequency = 
            str.chars()
               .mapToObj(c -> (char)c)
               .collect(Collectors.toMap(Function.identity(), c -> 1, Math::addExact));
Run Code Online (Sandbox Code Playgroud)