从Arrays.toString()中删除值;?

时间:2017-10-22 21:39:34

标签: java arrays string ascii

因此,目标是让用户给出一个字符串,然后控制台返回字符串中的字符及其频率。

输入" 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个出现的字符?

2 个答案:

答案 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"));