-1

次のコードを使用して、推測された子音が元の単語の一部である場合に、推測された子音を星の文字列に追加しています。wordWithGuess当初、私はへの呼び出しの間を保っていましたgetCurrentResult。しかし、その結果、新しいコンテンツが最後に追加され、wordWithGuess長くなり続けました (最近推測された文字を置き換えるだけではありません)。

以下のコードを実行すると、出力は次のようになります。

rを推測した後: ****r********
推測後: ************
t を推測した後: **tt********
lを推測した後:********ll**
nを推測した後:************n

私の目標は、次のようになることです。

rを推測した後: ****r********
s を推測した後: ****r********
t を推測した後: **tt*r******
l を推測した後: **tt*r**ll**
n を推測した後: **tt*r**ll*n

サンプルコードは次のとおりです。

public class Sample {
    String targetWord;
    String wordWithGuess = "";

    public Sample(String targetWord) {
        this.targetWord = targetWord;
    }

    public void guess(String consonant) {
        wordWithGuess = "";

        for (int i = 0; i < targetWord.length(); i++) {
            if (targetWord.substring(i, i + 1).equals(" ")) {
                wordWithGuess += " ";
            } else if (targetWord.substring(i, i + 1).equals(consonant)) {
                wordWithGuess += consonant;
            } else {
                wordWithGuess += "*";
            }
        }
    }

    public String getCurrentResult() {
        return wordWithGuess;
    }

    public static void main(String args[]) {
        String targetWord = "bitterbollen";

        Sample sample = new Sample(targetWord);

        String[] guesses = { "r", "s", "t", "l", "n" };

        for (String guess : guesses) {
            sample.guess(guess);
            System.out.println("After guessing " + guess + ": "
                    + sample.getCurrentResult());
        }
    }
}
4

4 に答える 4

1

推測されたすべての子音を保存し、変更する必要があります word.substring(i, i + 1).equals (consonant)

のようなものに

word.substring(i, i + 1) exists in the consonant guessed. (もちろんpusedo-codeです)

いくつかのヒント: Set (より正確には HashSet)、または String の contains() または indexOf() メソッドを見てください。


あなたへの追加の意見:

返された文字列を保存せずに word.substring(i, i + 1) を呼び出しています。これは無意味な呼び出しです。

word.substring(i, i + 1) を何度も呼び出す代わりに、一度呼び出して、返された文字列を多重比較に使用できます。

また、毎回 1 つの char を比較しているため、char を使用して文字を格納し、charAt() を使用して特定の位置の文字を取得する必要があります。

于 2013-01-07T02:30:39.097 に答える
1

問題は、呼び出しの間にいくつかの情報を保持する必要があることですguess()。これは、 のすべての値を保存するか、 の古い値を新しい子音とconsonantマージする方法を見つけることを意味します。wordWithGuess

最初のオプションは次のような意味です

import java.util.Set;
import java.util.HashSet;

class Sample {

    // ...

    Set<String> guesses = new HashSet<String>();

    public void guess(String consonant) {
        guesses.add(consonant);

        wordWithGuess = "";

        for (int i = 0; i < targetWord.length(); i++) {
            String cursor = targetWord.substring(i, i + 1);

            if (cursor.equals(" ")) {
                wordWithGuess += " ";
            } else if (guesses.contains(cursor)) {
                wordWithGuess += cursor;
            } else {
                wordWithGuess += "*";
            }
        }
    }

    // ...

}

これは、古い推測を として保存しSetます。最後の推測をチェックするだけでなく、推測されたguess()すべての文字が含まれるようになりました。

実際、コンストラクターを追加して、デフォルトで含めたい任意の文字でセットを初期化することもできます。これにより、最初の推測セットにあるため、スペースのチェックを排除できます。

import java.util.Set;
import java.util.HashSet;

class Sample {

    // ...

    Set<String> guesses;

    public Sample() {
        this.guesses = new HashSet<String>();
        guesses.add(" ");
    }

    public void guess(String consonant) {
        guesses.add(consonant);

        wordWithGuess = "";

        for (int i = 0; i < targetWord.length(); i++) {
            String cursor = targetWord.substring(i, i + 1);

            if (guesses.contains(cursor)) {
                wordWithGuess += cursor;
            } else {
                wordWithGuess += "*";
            }
        }
    }

    // ...

}

もう 1 つのオプションは、新しい推測を含めるように wordWithGuess を更新することです。C では、文字列を文字配列と同じように変更できるため、これを行うのは簡単です (たとえば、 .Java はその文字列をより厳密に保護しますが、配列を使用して同じ効果をwordWithGuess[i] = consonant得ることができない理由はありません。char

public class Sample {
    String targetWord;
    char[] currentResult;

    public Sample(String targetWord) {
        this.targetWord = targetWord;
        currentResult = new char[targetWord.length()];
        for (int i = 0; i < targetWord.length(); i++) {
            if(targetWord.charAt(i) == ' ') {
                currentResult[i] = ' ';
            } else {
                currentResult[i] = '*';
            }
        }
    }

    public void guess(String consonant) {
        for (int i = 0; i < targetWord.length(); i++) {
            String cursor = targetWord.substring(i, i + 1);

            if (cursor.equals(consonant)) {
                currentResult[i] = consonant.charAt(0);
            }
        }
    }

    public String getCurrentResult() {
        return new String(currentResult);
    }

    // ...

}
于 2013-01-07T01:30:24.600 に答える
0

前の反復の結果を保存する必要があります。oldWordWithGuess = wordWithGuessfor ループの最後にコードを配置します。

次に、ループで次のコードが必要になります。

...
if(oldWordWithGuess[i] != `*`) {
    wordWithGuess += oldWordWithGuess[i];
} else if (word.substring(i, i + 1).equals (" ")) {
...

そうすれば、以前の推測が入れられます。

于 2013-01-07T01:41:32.077 に答える
0

私は実際に、char配列を使用し、すべての文字をその配列の別の要素に格納する別のソリューションを見つけました。私は実際にこれを行うことを許可されていますか? これは、その機能に多くのリソースを必要としませんか?

于 2013-01-07T14:20:14.473 に答える