如何计算String中所有字符的出现次数?

时间:2013-10-18 22:01:26

标签: java string

package opop;

import java.util.Scanner;

public class Domashnoto {

    static public void main(String[] args){

        Scanner input = new Scanner(System.in);
        System.out.println("Text:");
        String s = input.next();

        s = s.toLowerCase();
        s = s.replaceAll("[^A-Za-z]+", "");
        s.replaceAll("\\s+", "");


        int j;
        int i;

        for (j = 0 ; j <= s.length() ; j++){
            int counter = 0;
             for (i = 0 ; i <= s.length(); i++){
                if(s.charAt(i) == s.charAt(j)){

                    counter++;
                }
            }
            System.out.println(s.charAt(i) + " " + "-" + " " + counter);
        }



    }

}

HELP!我只是不知道什么不好

2 个答案:

答案 0 :(得分:1)

您对循环的两次<= s.length()测试应为< s.length()

System.out.println(s.charAt(i)...应为System.out.println(s.charAt(j)...,因为此时i循环已完成。

此声明:s.replaceAll("\\s+", "");不执行任何操作,因为您未将结果分配回s。它会从字符串中删除空格,但无论如何都没关系,因为上面的行已经删除了所有非字母字符。

如果你修复了前几件事,那就可以了。


但是,对于一个更加清晰且完全避免重复报告相同字符的完全替代方法,您可以使用map将字符映射到其频率的整数计数,如下所示:

Map<Character,Integer> charMap = new HashMap<>();
for (char c : s.toCharArray()) {
    if (!charMap.containsKey(c)) {
        charMap.put(c, 1);
    } else {
        charMap.put(c, charMap.get(c) + 1);
    }
}

它会迭代字符串的每个字符(c),如果地图中不包含该字符,则指定频率为1,或者如果它确实包含该字符,则会获得之前的频率,添加1,然后放回去。

然后您可以迭代地图以显示频率:

for (char c : charMap.keySet()) {
    System.out.println(c + " - " + charMap.get(c));
}

HashMap中字符的顺序基本上是随机的。您可以将其更改为LinkedHashMap以保留每个字符首次出现的顺序,或TreeMap按字母顺序对其进行排序。

(P.S。要使用此方法,您还需要import java.util.*;或导入特定的类。)

答案 1 :(得分:1)

最快的方法(仅适用,因为只能有65536个不同的字符:

public static void main(String[] args) {
    String s = "asdfasdfasasasasa";
    int[] counters = new int[65536];

    for (char c: s.toCharArray()) ++counters[c];
    for (int i = 0; i < counters.length; ++i) {
      if (counters[i] > 0) System.out.println((char)i + " - " + counters[i]);
    }
}