如何计算java中每个字符串中字符的出现次数?

时间:2014-11-16 13:34:14

标签: java string character

这里我有打印单个字符数的代码,但我希望每个字符都出现次数。我的代码如下所示:

String s = "abdsd3$asda$asasdd$sadas";
int counter = 0;
for (int i = 0; i < s.length(); i++) {
    if (s.charAt(i) == '$') {
        counter++;
    }
}
out.println("$ Occurence:" + counter + "times");`

我想要的输出是:a:7,b:1,d:6,s:6,$:3次。 有谁能够帮我?我们将非常感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

回想一下,字符是无符号整数类型(即数字),范围为0..65535。如果您知道所有字符都在0..127范围内,即第一组UNICODE代码点包括所有数字,两种情况下拉丁字母的字母以及许多常见的特殊字符,您可以创建一个计数器数组:

int[] counts = new int[128];
for (int i = 0; i < s.length(); i++) {
    char ch = s.charAt(i);
    if (ch < 128) {
        counts[ch]++;
    } else {
        System.err.println("Character is out of range: "+ch);
    }
}

现在您可以按如下方式打印计数:

for (char c = 0 ; c < 128 ; c++) {
    if (counts[i] != 0) {
        System.out.println(c + " : " + counts[c]);
    }
}

Demo.

答案 1 :(得分:0)

首先,使用

对字符串中的字符进行排序
char[] arr = s.toCharArray();
Arrays.sort(arr);

现在,当arr被排序时,只需执行您之前所做的计算,当位置i中的字符与arr [i-1]不同时,从零开始计数器:

public class CountChars {

    public static void main(String[] args) {
        String s = "abdsd3$asda$asasdd$sadas";
        char[] arr = s.toCharArray();
        java.util.Arrays.sort(arr);
        int cnt = 0;
        final char UNDEF = (char)-1;
        char c = UNDEF, prev = UNDEF;
        for(int i = 0; i<arr.length;++i){
            c = arr[i];
            if(c!=prev){
                if(prev!=UNDEF){
                    System.out.println("The character '" +prev + "' occurs " + cnt +" times");
                }
                prev = c;
                cnt = 1;
            }else{
                cnt++;
            }
        }
        if(c!=UNDEF){
            System.out.println("The character '" +c + "' occurs " + cnt +" times");
        }
    }
}

答案 2 :(得分:0)

public static void main(String[] args) {

    LinkedHashMap<Character, Integer> h = new LinkedHashMap<>();

    String s = "abdsd$asda$asasdd$sadas";

    for (char ch : s.toCharArray()) {

        if ((h.containsKey(ch))) {

            h.put(ch, h.get(ch) + 1);

        } else {

            h.put(ch, 1);

        }
    }

    for (char key : h.keySet()) {

        System.out.println(key + "-" + h.get(key));

    }
}

答案 3 :(得分:0)

使用流api的精美的一线解决方案:

    Arrays.stream(new Scanner(System.in).nextLine().replace(" ", "").chars().mapToObj(c -> (char) c) //toCharArray returns primitive array
            .toArray(Character[]::new))
            .collect(Collectors.groupingByConcurrent(Function.identity(), Collectors.counting()))
            .forEach((k, v) -> System.out.println(k + ", " + v));