4
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

私のせいはどこですか?

4

6 に答える 6

3

問題は、文字列ごとに1つ作成するのではなく、文字列内の文字ごとに新しいカウンターを作成していることです。基本的に、プログラムは、現在の文字の後の位置にある文字列に文字が出現する回数をカウントします。

この問題の修正は比較的簡単です。アルファベットの各文字にカウンターを作成し、対応する文字が表示されたらインクリメントします。大文字と小文字を区別して行うと仮定すると、次のように行うことができます。

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]);
        }
    }
}
于 2012-12-17T22:42:58.873 に答える
3

マップを使用して同じ結果を得る方法の簡単な例を次に示します。

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));
}

マップでもっと読む:

于 2012-12-17T22:54:51.393 に答える
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;
}
于 2012-12-17T22:43:28.433 に答える
1

配列を反復処理し、要素のマップを作成して、各マップエントリがそのキーに遭遇した回数のカウントになるようにします。したがって、キーがマップに存在しない場合は、カウント1で追加します。それ以外の場合は、そのキーの増分カウントでマップを更新します。

于 2012-12-17T22:44:04.600 に答える
1

基本的に、文字列内の各文字にカウンターがあります。1つのマップを保持し、各文字のカウントを累積する必要があります。

このようなもので十分なはずです

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() + " )");
        }
    }
于 2012-12-17T22:54:19.613 に答える
0

マップを使用した実装は次のとおりです。

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());
    }
}
于 2012-12-17T23:12:17.420 に答える