3

絞首刑執行人の宿題を書かなければなりません。char 配列を使用することは許可されておらず、String メソッドのみを使用して文字列自体を操作します。私が直面している問題は、文字列ビルダーで重複をチェックしようとしたときです。

これが私の絞首刑法です

public void playHangMan(Scanner guessWord)
{
    int error = 6;
    String letter;
    boolean vali, dup;

    displayHangman();// call displayHangman method

    // get input, lower case input, and then validate in a loop
    do
    {
        letter = guessWord.nextLine();
        letter = lowerGuess(letter); // call lowerGuess method
        vali = letter.matches("[a-z]");

        dup = checkDup(letter); // call checkDup method

        if(vali == false)
        {
            System.out.print("Please enter only a SINGLE letter: ");
        }
        else if(dup == true)
        {
            System.out.print("Duplicated letter, please enter another: ");
        }

        if(dup == false && vali == true)
        {
            this.guessAns.append(letter);
        }

    }
    while(vali == false && dup == false);


}// end playHangman method

私の複製方法:

private boolean checkDup(String letter)
{
    int i;
    boolean dup = false;

    // check guessAns StringBuilder for duplicate letters
    for(i = 0; i <= this.guessAns.length() - 1 && dup == false; i++)
    {
        if(letter.equals(this.guessAns.charAt(i)))
        {
            dup = true;
        }
    }

    if(dup == true)
    {
        return true;
    }
    else
    {
        return false;
    }   
}// end checkDup method

問題は、私の checkDup メソッドが重複を見つけられないことです。文字列ビルダーに文字 a を追加して、文字の値 a を入力しようとしましたが、まだうまくいきません。String を Char と比較しているのでletter.equals(this.guessAns.charAt(i))、checkDup メソッドが重複を見つけられないのはなぜですか? 誰かがこれを回避する方法を説明できますか? どんな助けでも大歓迎です。

4

3 に答える 3

4

これを回避する2つの方法:

letter.charAt(0) == guessAns.charAt(i);

上記の解決策letterは、 が単一の であるという仮定の下にありcharます。

もう 1 つの方法は、次のように呼び出すことCharacter.toStringですchar

letter.equals(Character.toString(guessAns.charAt(i)));
于 2013-11-03T04:30:04.730 に答える
4

String.equals(char)文字列が文字と等しいと比較されることはないため、呼び出しは常に false を返します。これらを文字として比較するには、次のようにします。

if(letter.charAt(0) == this.guessAns.charAt(i)) {
于 2013-11-03T04:30:20.617 に答える
0

重複をチェックする別の方法があります:正規表現を使用します。正規表現は、 と の間で文字が繰り返される.*([a-z])\1.*任意のものと一致します。より一般的に言えば、任意の繰り返し文字と一致します。Stringaz.*(.)\1.*String

dup = letter.matches(".*([a-z])\\1.*");

仕組み:.任意の文字に一致し、*0 回以上を.*意味するため、任意の量の任意の文字を意味します (任意の量の文字を「消費」します)。グループ(を開始します。グループを終了します。から までの任意の文字に一致します。後方参照です。したがって、正規表現は、直後に同じ文字が続く文字を探します。)[a-z]az\1[a-z]

注:String分離されていても同じ文字が含まれているかどうかを確認したい場合、これは機能するはずです:.*([a-z]).*\1.*

于 2013-11-03T05:46:49.040 に答える