因此,目标是让用户给出一个字符串,然后控制台返回字符串中的字符及其频率。
输入" AAAAbbbbccdd 42424242&& %% $#@" (减去引号)应该给......
freq:2
。#freq:1
$ freq:1
%freq:2
&安培; freq:2
2 freq:4
4 freq:4
@ freq:1
频率:4
b freq:4
c freq:2
d freq:2
它们也应该按照ASCII表的字母顺序排序,但我现在并不关心。
这是我的方法代码:
doStuff
为了空间,我不会在这里粘贴输出,但是输出将读回256元素数组的每个元素并告诉我该字符出现0次。有没有办法让我打印出字符串时不显示所有0个出现的字符?
答案 0 :(得分:2)
您可以根据以下值简单地过滤掉数组中的元素:
ascii = Arrays.stream(ascii).filter(x -> x > 0).toArray();
但这并没有太多用处:你失去了频率和字符之间的对应关系。它们是频率。
而是过滤索引流:
IntStream.range(0, ascii.length).filter(x -> ascii[x] > 0)
此流为您提供数组中具有非零值的元素的索引。
您可以在构建输出时使用它:
System.out.println(
IntStream.range(0, ascii.length)
.filter(x -> ascii[x] > 0)
.mapToObj(x -> String.format("%s: freq %s", (char) x, ascii[x]))
.collect(Collectors.joining("\n")));
答案 1 :(得分:0)
如果您对使用Collectors
api中的stream
函数的其他解决方案感兴趣:
String string = "AAAAbbbbccdd 42424242 &&%%$#@";
String result = Arrays.stream(string.split(""))
.collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()))
.entrySet()
.stream()
.map(entry -> entry.getKey() + " freq: " + entry.getValue())
.collect(Collectors.joining("\n"));