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

输入“ AAAAbbbbccdd 42424242 && %% $#@”(减去引号)应为...

频率:2

。#频率:1

$ freq: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")));

关于java - 从Arrays.toString();中删除值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46879408/

10-09 06:04