Bil*_*ill 29 java string key-value
我需要编写某种循环来计算字符串中每个字母的频率.
例如:"aasjjikkk"将计为2'a',1'',2'j',1'i',3'k'.最终像这样的id最终会出现在一个地图中,其中字符为键,计数为值.有什么好主意怎么做?
小智 33
您可以使用java Map并将a映射char到int.然后,您可以遍历字符串中的字符并检查它们是否已添加到地图中,如果有,则可以增加其值.
例如:
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的解决方案并计算总发生次数.
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()如果键存在或返回(默认)第二个参数得到的值.
从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)