繁体   English   中英

计算字符串中每个字符出现的次数并将其放入数组中

[英]Count the occurrence of each character in a string and put it in an array

因此,我正在计算我之前扫描的 Java 文件中字符串中每个字母的出现次数。 我从字符串中删除了所有不必要的字符,现在字符串只包含 unicode 字母。 一个例子:

String letters = "wecanendupclimbingthewrongladderandpursuesomeoneelsesversionofsuccess";

所以假设我创建了一个数组来包含每个字母的频率。

int[] frequency = new int[26];

我根据字母表中的字母将事件按顺序排列。 所以假设a是5,b是3,c是10。应该是这样的:

frequency = {5, 3, 10};

你认为我能做到什么程度最好?

通过(ch - 'a')计算与frequency数组相关的字符索引

从字符中减去字符'a'

        String letters = "aaaabbabbz";
        letters = letters.toLowerCase();
        int[] frequency = new int[26];
        for (char ch : letters.toCharArray()) {
            int index = ch - 'a';
            frequency[index]++;
        }
        System.out.println(Arrays.toString(frequency));

        // in case you want only the characters that appear you can use IntStream and filter
        int[] result = IntStream.of(frequency).filter(i -> i > 0).toArray();
        System.out.println(Arrays.toString(result));

, output

[5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[5, 4, 1]

好的解决方案是使用TreeMap以保持字符按字母顺序排序,然后在遍历字符后获取相应的值列表(出现次数)。

这是一个例子:

String str = "wecanendupclimbingthewrongladderandpursuesomeoneelsesversionofsuccess";
Map<Character,Integer> map = new TreeMap<>();
for(char c : str.toCharArray())
    map.put(c, map.getOrDefault(c, 0)+1);
System.out.println(map.values());

Output:

[3, 1, 4, 4, 11, 1, 2, 1, 3, 3, 2, 7, 5, 2, 4, 8, 1, 4, 1, 2]

如果要包含不存在的字符(字符串中出现零次的字符),可以首先使用所有字母初始化 map,如下所示:

for(int i = 0; i < 26; i++)
    map.put((char)(97 + i), 0);

然后,output 将是:

[3, 1, 4, 4, 11, 1, 2, 1, 3, 0, 0, 3, 2, 7, 5, 2, 0, 4, 8, 1, 4, 1, 2, 0, 0, 0]

给这只猫剥皮的方法有很多,我认为最简单的方法可能是根据字符 ASCII 值进行排序。 例如,'a' 的值是 97,所以无论你遇到什么字母,只需将其转换并减去 97 以将其放入数组中的适当位置(假设你想要 arr[0] = 'a' 的频率,arr[1 ] = 'b' 的频率等)。 因此,如果您出现字母“字母”,只需在索引 int(letter) - 97 处增加数组值,如果这有意义的话。 同样,有很多方法可以解决这个问题,你的思考过程也很好。

或者如评论中所述,您可以只使用键/值 map 哈哈

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM