0

私がJavaの基本を理解したと思ったとき(完全な学期でした!)、何かが私にそれを疑わせることがあります。私はいくつかの練習レビューを行っていますが、少し問題があります。コードは次のとおりです。

public class LetterCount 
{
    private char[] wordArray;
    private int numVowels = 0, numConsonants = 0, numSpaces = 0, numDigits = 0;

    public LetterCount(String str)
    {
        wordArray = str.toCharArray();
    }

    public int getNumVowels()
    {
        for (int count = 0; count < wordArray.length; count++)
        {
           if (wordArray[count] == 'a' || wordArray[count] == 'e' || 
               wordArray[count] == 'i' || wordArray[count] == 'o' || wordArray[count] 
               == 'u' || wordArray[count] == 'y')

           numVowels++;
        }
        return numVowels;
    }

    public int getNumDigits()
    {
        for (int count = 0; count < wordArray.length; count++)
        {
            if (Character.isDigit(wordArray[count]))
                numDigits++;
        }
        return numDigits;
    }

    public int getWhiteSpace()
    {
        for (int count = 0; count < wordArray.length; count++)
        {
            if (Character.isSpaceChar(wordArray[count]))
                numSpaces++;
        }

        return numSpaces;
    }

    public int getNumConsonants()
    {       
        numConsonants = wordArray.length - getNumVowels() - getNumDigits() - getWhiteSpace();

        return numConsonants;
    }

    public String toString()
    {
        String str = "Characters: " + wordArray.length + "\n" +
    "Vowels: " + getNumVowels() + "\n" +
                "Consonants: " + getNumConsonants() + "\n" +
                "Digits: " + getNumDigits() + "\n" +
                "Spaces: " + getWhiteSpace();

        return str;
    }
}

出力は次のとおりです。

Enter a sentence: this is a test 4 u
Characters: 18
Vowels: 5
Consonants: 2
Digits: 2
Spaces: 10

私の質問:1)toString()メソッドでフィールド名を使用できると確信していました(たとえば、numVowelsgetNumConsonants())が、このクラスではメソッド名を使用する必要があるようです。フィールド名を使用すると0になります。なぜ違いがあるのですか?方程式を返す場合は、メソッド名を使用する必要があることを私は知っています。

2)numConsonants()メソッドが正しい数値を返さない理由もわかりません。各フィールドを個別に返すと(フィールド名を呼び出せないためメソッドを呼び出すと)、正しい番号が取得されます。それらを方程式に入れてください、そしてそれは正しくありません。私は何が間違っているのですか?

これが元の主な方法です。それ以来、LetterCountクラスのメソッドを呼び出すように編集しました。

    import java.util.Scanner;


public class LetterCountDemo {

    public static void main(String[] args) 
    {
        String sentence;
        LetterCount lc;
        Scanner keyboard = new Scanner(System.in);

        System.out.print("Enter a sentence: ");
        sentence = keyboard.nextLine();

        lc = new LetterCount(sentence);

        System.out.println(lc);
    }

}

追加した:

        lc.getNumVowels();
    lc.getNumConsonants();
4

3 に答える 3

2

「フィールド」(「メンバー変数」と呼ばれます)を使用できますが、この場合、ゼロに初期化され、メソッドによってのみ更新されます。

したがって、メソッドを呼び出さない場合、メンバー変数は更新されないため、ゼロのままになります。

また、「フィールド名を呼び出さない」-値を返す可能性のあるメソッドを呼び出すことができます。その値を参照でき、同様にメンバー変数を参照できます。

于 2012-12-07T03:43:59.713 に答える
1

最初の質問に対する答えは比較的簡単です。メソッドが少なくとも1回呼び出されるまで、フィールドはゼロです。つまり、フィールドはメソッドに設定されるため、最初にメソッドを呼び出す必要があります。

2番目の質問への答えは関連しています。、、、またはを呼び出すgetNumVowelsと、フィールド値が増加します。最初にそれらをゼロに初期化すると、アプローチは機能します。getNumDigitsgetWhitespace

于 2012-12-07T03:44:40.050 に答える
0

フィールドの代わりにメソッドを使用しなければならない理由は単純です。あなたのメソッドは単純なアクセサメソッドではありません。(このリンクをチェックしてください)それらはいくつかの計算を行い、ファイルされた変数を更新してそれらを返します。したがって、メソッドを呼び出すまで、フィールドの値はゼロです。

フィールド変数を更新するこの方法は良くありません。メソッドを2回呼び出すと(例getNumVowels:)、すでに更新されているフィールド変数が更新されますnumVowels

問題getNumConsonantsは上記の回答に関連しています。

ここでの解決策は、フィールド変数を使用せず、ローカル変数を使用することです。以下の例を参照してください。

public int getNumDigits()
{
    int numDigits = 0;
    for (int count = 0; count < wordArray.length; count++)
    {
        if (Character.isDigit(wordArray[count]))
            numDigits++;
    }
    return numDigits;
}

この変更により、getNumDigits()常に正しい答えが返されます。

于 2012-12-07T03:55:48.697 に答える