0

配列メソッドへの私のコードは次のとおりです。

private int _a;

public static void main(String[] args) {}

public int[] countAll(String s) {
    int[] xArray = new int[27];
    int[] yArray = new int[27];
    _a = (int)'a';

    for (int i = 0; i < xArray.length; i++) {
        xArray[i] = _a;
        _a = _a++;
    }

    for (int j = 0; j < s.length(); j++) {
        s = s.toLowerCase();
        char c = s.charAt(j);
        int g = (int) c;
        int letterindex = g - yArray[0];
        if (letterindex >= 0 && letterindex <= 25) {
            xArray[letterindex]++;
        } else if (letterindex < 0 || letterindex > 25) {
            xArray[26]++;
        }
    }
    return xArray;
}

このコードは Java で動作しますが、もっと簡単な方法があると言われました。コードの簡略化されたバージョンを理解するのに苦労しています。私を助けてください。

4

5 に答える 5

2

大文字と小文字を数えるだけの場合、それは非常に回りくどい方法です。次のようなものの何が問題になっていますか。

public static int countUpper(String str)
{
    int upper = 0;
    for(char c : str.toCharArray())
    {
        if(Character.isUpperCase(c))
        {
            upper++;
        }
    }
    return upper;
}

Character.isLowerCase(c)次に、反対の場合とまったく同じことです。

于 2013-02-04T06:32:47.477 に答える
1
public static int[] countAll(String s) {
    int[] xArray = new int[27];

    for (char c : s.toLowerCase().toCharArray()){
        if (Character.isLetter(c))
            xArray[c -'a']++;
        else
            xArray[26]++;
    }

    return xArray;
}
于 2013-02-04T06:44:17.397 に答える
0

コードに加える必要のある2つの重要な改善点は次のとおりです。

  • のメソッドjavadocを追加して、読者がメソッドの想定countAllをリバースエンジニアリングするために20行以上のturgidコードをトロールする必要がないようにします。

  • _a嫌悪感を取り除きます。最も広く受け入れられているJavaコーディング標準によると、アンダースコア文字は変数名に含まれていません。その上、aこれは私が今まで出会った中で最も役に立たないフィールド名についてです。読者に何らかの意味を伝えることを意図しているのなら...あなたは私を完全に失ってしまいました。

    (ああ、わかりました。フィールドであってはなりません。Bzzzt!!!)


次に、yArray配列があります。私が知る限り、それが使用されている唯一の場所はここにあります:

int letterindex = g - yArray[0];

これは実際には次と同じです:

int letterindex = g;

yArray[0]に割り当てられることはありません。要するにyArray、完全に冗長です。


この:

    if (letterindex >= 0 && letterindex <= 25) {
        xArray[letterindex]++;
    } else if (letterindex < 0 || letterindex > 25) {
        xArray[26]++;
    }

パーツの状態elseは冗長です。これを書くだけで、コードが読みやすくなります。

    if (letterindex >= 0 && letterindex <= 25) {
        xArray[letterindex]++;
    } else {
        xArray[26]++;
    }

2つは同等です。理由がわかりますか?


最後に、xArray要素の初期化は私には明らかに間違っているように見えます。カウントが含まれている場合xArray、要素はゼロから開始する必要があります。(なぜあなたのコードはすべての文字列にたくさんの「ジーズ」が含まれているとあなたに言っているのか不思議ではありませんか?)

「このコードはJavaで動作します...」

私はそうは思わない。多分それはコンパイルします。多分それはクラッシュすることなく実行されます。しかし、それは正しい答えを与えません!

于 2013-02-04T06:32:09.337 に答える
0

プログラムが文字列内のさまざまなアルファベットの頻度を見つけようとしているようで、特別なインデックス 26 で非文字をカウントしています。その場合、カウントを初期化するコードが間違っています。次の for ループでいくつかの値で事前に初期化されています。

for (int i = 0; i < xArray.length; i++) {
        xArray[i] = _a;
        _a = _a++;
    }

メソッドは単純に次のようなものになると思います。

s = s.toLowerCase();
int histogram[] = new int[27];

for (char c: s.toCharArray()) {
    int index = c - 'a';

    if (index < 0 || index > 25) {
        index = 26;
    }

    histogram[index]++;
}
于 2013-02-04T06:43:43.183 に答える
0
public static int[] countAll(String s) {
    int[] count = new int[26];

    for (char c : s.toLowerCase().toCharArray()) {
        if ('a' <= c && c <= 'z') {
            count[c - 'a']++;
        }
    }

    return count;
}

まず..あなたの配列はどこで大きくなりますか。

2番目..なぜ2つの配列が必要なのですか?

3 番目.. あなたのコードは機能していないようでした.. 「こんにちは」という単語は、数字 97 (26 回) と数字 102 の配列を返しました。

編集:短くしました。

于 2013-02-04T07:51:03.837 に答える