1

文字列内の文字の出現をカウントする以下のプログラムがあります。たとえば、文字列 - が与えられた場合my name is stack overflow、出力を次のようにしたい

f 1 e 2 c 1 a 2 n 1 o 2 l 1 m 2 k 1 i 1 w 1 v 1 t 1 s 2 r 1 y 1

しかし、何かがおかしいようで、何が原因なのかわかりません。また、注意してください - 過去に投稿されたプログラムがいくつかあります。重複の可能性があります。しかし、他の誰かの解決策を使用するのではなく、特定の問題について助けてもらいたいです。

コードは次のとおりです。

//Count the occurence of a character in a string
package strings;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CharacterOccurenceInAString {
    private static Map<Integer, Character> str = new HashMap<Integer, Character>();
    private static List<Character> charList = new ArrayList<Character>();
    private static Character value;

    public static void main(String[] args) {
        BufferedReader br = null;
        String input = "";
        try {
            br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Please enter a string");
            input = br.readLine();
            charOccurence(input);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public static void charOccurence(String s) {        
        for (int i = 0; i < s.length(); i++) {
            // Don't include white spaces -         
            if (Character.isWhitespace(s.charAt(i))) {
                continue;
            } else {
                str.put(i, s.charAt(i));
                charList.add(s.charAt(i));
            }
        }
        for(Character val:str.values()){
                getCount(val);
        }
    }

    static boolean flag = false;
    public static int getCount(Character c) {
        int ct = 0;
        for (int i = 0; i < charList.size(); i++) {         
            c = charList.get(i);
            if (charList.contains(c)) {
                ct++;
                flag=false;
            }           
        }
        if(flag==false)
        {
        System.out.println(c + ":" + ct);
        }
        return ct;
    }
}

これは私が得る出力です:

Please enter a string
my name is stack overflow
w:21
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21
4

4 に答える 4

1

グアバで:

Multiset<Character> occurrences = HashMultiset.create(
    Lists.charactersOf(CharMatcher.WHITESPACE.removeFrom("the string")));
于 2013-05-02T21:07:23.497 に答える
0

コードに最小限の変更を加えてこれを機能させるには、次のようにします。

public static int getCount(Character c) {
    int ct = 0;
    for (int i = 0; i < charList.size(); i++) {         
        //c = charList.get(i); //why were you doing this, this method takes the desired c as an input?
        if (charList.get(i).equals(c)) { //now it only incriments when that particular entry equals c, not if ANY entry matches c
            ct++;
            flag=false;
        }           
    }
    if(flag==false)
    {
    System.out.println(c + ":" + ct);
    }
    return ct;
}

getCount のバージョンでは、文字が文字列内のどこかにある場合、ループのたびに ct に 1 を追加して文字列全体を調べます。また、getCount 内で c を変更する必要はありません。

この変更によってコードが完全になるわけではありません。繰り返される文字は繰り返される (ただし正しい) 出力につながりますが、正しい方向に向けられるはずです。

于 2013-05-02T21:08:15.567 に答える
0

文字数を取得したい場合は、Map< Integer,Character> ではなく Map< Character, Integer> を実行する方がはるかに優れています。

Map<Character, Integer> charCount = new HashMap<Character,Integer>();
for (int i = 0; i < s.length(); i++) {
    Integer count = charCount.get(s.charAt(i));
    if (count == null)
        count = 0;
    charCount.put(s.charAt(i), ++count);
}

これにより、すべての文字の出現回数へのマップが取得されます。

于 2013-05-02T21:06:12.507 に答える
-2

専門家に尋ねる代わりに、Eclipse のステップ モードでコードをデバッグして、まず自分で間違いを見つけてみることをお勧めします。各ステートメントをステップ実行して、変数の値を確認できます。それは楽しくて有益です:)

于 2013-05-02T21:10:21.403 に答える