从 Arrays.toString();中删除值



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

输入"AAAAbbbbccdd 42424242 &&%%$#@"(减去引号)应该给出...

频率:2

.# 频率:1

$ 频率: 1

% 频率: 2

频率:2

2频率:4

4 频率: 4

@频率:1

频率:4

B 频率: 4

C 频率: 2

D 频率:2

它们也应该根据 ASCII 表按字母顺序排序,但我现在并不关心这一点。

这是我的方法的代码:

    public static void alphabeticalSort(String input)
{
    int[] ascii = new int[256];
    for (int i = 0; i < input.length(); i++) {
        char current = input.charAt(i);
        ascii[(int)current]++;
    }
    String asciiStr = Arrays.toString(ascii).replace("[", "").replace("]", "").replace(",", "n freq:");
    System.out.println(asciiStr);
}

为了空间起见,我不会在此处粘贴输出,但输出将读回 256 元素数组的每个元素,并告诉我该字符出现了 0 次。有没有办法使打印出字符串时不显示所有 0 出现的字符?

您可以简单地根据值从数组中过滤掉元素:

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

如果您对使用 stream API 中的Collectors函数的其他解决方案感兴趣:

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

最新更新