计算数组中元素的出现次数

时间:2012-12-17 22:40:34

标签: java arrays

char [] array = {a,a,a,b,b,c,c,c,a,d};

我想计算该数组中的每个相同元素,以便我可以从最高频率到最低频率进行排序。 我希望输出变成这样:

4 (for a)
2 (for b)
3 (for c)
1 (for d)

我试过这个

public static void CountbyChar(String s){
    int [] arr = new int [s.length()];
    char [] c =s.toCharArray();
    for (int i=0;i<c.length;i++){
        arr[i]=1;
        for (int j=i+1;j<c.length;j++){
            if(c[i]==c[j]){
                arr[i]++;
            }
        }
    }
    for (int x:arr){
        System.out.println(x);
    }
}

但我得到了:

4
3
2
2
1
2
1
1

我的错在哪里?

6 个答案:

答案 0 :(得分:3)

问题是您要为字符串中的每个字符创建一个新计数器,而不是为每个可能的字母创建一个。从本质上讲,您的程序会计算字符在当前字符之后的位置中出现的次数。

修复此问题应该相对容易:为字母表中的每个字母创建计数器,并在看到相应的字母时递增它们。假设你是区分大小写的,你可以这样做:

public static void CountbyChar(String s){
    int [] arr = new int [256];
    for (char c : s.toCharArray()){
        if (c < 256) {
            arr[c]++;
        }
    }
    for (int i = 0 ; i != 256 ; i++) {
        if (arr[i] != 0) {
            System.out.print((char)i);
            System.out.print(" : ");
            System.out.println(arr[i]);
        }
    }
}

答案 1 :(得分:3)

以下是如何使用Map实现相同结果的简单示例:

char[] inputChars = { 'a', 'b', 'c', 'a', 'a', 'b', 'a', 'a' };

//  create a map whose keys will be the chars in the array and
//  whose values will represent the number of times each char 
//  occurs in the input array.

Map<Character, Integer> countMap = new HashMap<Character, Integer>();

// loop over the input array and populate the map

for (char c : inputChars) {
    if (countMap.containsKey(c)) {
        int currentCount = countMap.get(c);
        countMap.put(c, currentCount + 1);
    }
    else {
        countMap.put(c, 1);
    }
}

// test it

for (char c : countMap.keySet()) {
    print(c + ": " + countMap.get(c));
}

更多地图阅读:

答案 2 :(得分:1)

这是因为你要独立处理每个角色的位置 - 这意味着你只是在角色出现后才计算。

编辑:因为我被击败了,这是一个正确的例子:

public int[] charFrequency(String s) {
    int[] frequencies = new int[256];
    for (char c : s.toCharArray()) {
        if (c > 0 && c < 256) {
            frequencies[c]++;
        }
    }
    return frequencies;
}

答案 3 :(得分:1)

您希望迭代数组并构建元素的映射,以便每个映射条目都是您遇到该键的次数的计数。因此,如果地图中不存在该键,请将其添加为计数1,否则使用该键的递增计数更新地图。

答案 4 :(得分:1)

你基本上为字符串中的每个字母都有一个计数器,你应该保留一个Map并累计每个字母的计数。

这样的事情就足够了

public static void CountbyChar(String s){
        HashMap<Character, Integer> letterCountMap = new HashMap<Character, Integer> ();
        char [] c =s.toCharArray();
        for (int i=0;i<c.length;i++){
            Integer count = 0;
            if (letterCountMap.containsKey(c[i])){
                count = letterCountMap.get(c[i]) + 1 ;
            }else {
                count = 1;
            }
            letterCountMap.put(c[i], count);
        }
        for (Map.Entry<String, String> entry : letterCountMap.entrySet())
        {
            System.out.println(entry.getValue() + "( for" + entry.getKey() + " )");
        }
    }

答案 5 :(得分:0)

以下是map的实现:

public static void countbyChar(String s){
    Map<Character, Integer> map = new HashMap<Character,Integer>();

    for (char c : s.toCharArray()){
         Integer count = map.get(c);
         if (count == null) {
            map.put(c, 1);
         }
         else {
            map.put(c, count + 1);
         }
    }

    for (Map.Entry<Character, Integer> entry : map.entrySet())
    {
        System.out.println(entry.getKey().toString() + "/" + entry.getValue().toString());
    }
}