0

私は初心者プログラマーで、ハングマンの非常にシンプルなバージョンを作成しようとしています。コードに問題があります。これは私が問題を抱えているコードの部分です:

        for(int i = 0; i <= wordLength - 1; i++ ) {

            if (letter == theWord.charAt( i )) {

                onemore=i+1;
                System.out.println("This letter matches with letter number " + onemore + " in the word.");
                ***displayWord.charAt(i)=letter;***
                System.out.println("The word so far is " + displayWord);
            } 

        }

エラーが発生している部分には、両側に3つのアスタリスクがあります。

displayWordは文字列であり、文字は文字です。

Netbeansは私に言います:

unexpected type
  required: variable
  found:    value

何が問題なのかわかりません。

4

4 に答える 4

4

基本的に、JavaStringは不変です。つまり、内容を変更することはできません。

を使用したほうがよいでしょうStringBuilder

String theWord = "This is a simple test";
char letter = 'i';
char changeTo = '-';

StringBuilder displayWord = new StringBuilder(theWord);

int i = theWord.indexOf(letter);
if (i != -1) {
    System.out.println("This letter matches with letter number " + (i + 1) + " in the word.");
    displayWord.setCharAt(i, changeTo);

    System.out.println("The word so far is " + displayWord);
}

System.out.println(displayWord);

これにより、次のようになります。

This letter matches with letter number 3 in the word.
The word so far is Th-s is a simple test
This letter matches with letter number 6 in the word.
The word so far is Th-s -s a simple test
This letter matches with letter number 12 in the word.
The word so far is Th-s -s a s-mple test
Th-s -s a s-mple test

これで、短いバージョンは次のようになります。

String displayWord = theWord.repace(letter, changeTo);
于 2012-08-09T03:27:23.600 に答える
0

そのエラーについてはよくわかりませんが、Javaではそのようなスタイルで文字を更新することはできません。

代わりに、StringBuilderdisplayWordに使用してみてください。それには方法があります:それはsetCharAtあなたが望むものかもしれません。

幸運のコーディング:)

于 2012-08-09T03:27:46.613 に答える
0

charAt(i)は、単語のその部分の文字の値を返します。値を変更するために使用することはできません。Javaの文字列は不変であるため、実際にはこれを変更することはできません。(コンストラクターまたはreplaceXXX関数の1つを使用して)新しいものを作成し、それをdisplayWordに割り当てるか、このタイプのものに対してより効率的なStringBufferクラスを確認することができます。

于 2012-08-09T03:30:20.900 に答える
0

は不変オブジェクトであるためString、その内容を変更することはできません。不変とは、 のコンテンツStringが設定されると、それを変更できないことを意味します。参照はいつでも変更できますが、コンテンツ自体は変更できません。

そうは言っても、Stringオブジェクトはこの原則に違反する方法を提供していません。いいえsetCharAt、の結果に新しい値を割り当てることはできませんcharAt(i)String(のような)を変更するように「見える」一部のメソッドが、replace代わりに、変更された新しいクローン オブジェクトを返すことに注意してください。例えば:

String sample = "Hello World!";
sample.replace('e', '*');
System.out.println(sample);

上記のコードに変更を加えていないsampleため、画面に表示される結果は になりますHello World!replaceメソッドによって行われた変更をキャプチャするには、sample変数を の結果に再割り当てする必要がありreplaceます。

String sample = "Hello World!";
sample = sample.replace('e', '*');
System.out.println(sample);

この場合、によって返されsampleた新しいクローンで変数を更新しています。この値は変更されるため、出力されます。StringreplaceH*llo World!

s の内容を変更できない理由がわかったので、Stringどのような解決策があるか見てみましょう。

  1. 何よりもまず、プログラムの正確な動作を維持するための完璧な方法は、StringBuilder前に指摘された @MadProgrammer のようなものを使用することです。クラスを見る単純すぎる方法は、StringBuilder基本的には変更可能なものStringです。それを使用すると、あらゆる種類の交換と変更を行うことができます。

  2. もう 1 つの解決策 (お勧めしません) は、Stringを使用して、キャラクターを変更するたびに新しいコピーを作成することです。これは非常に面倒であり、StringBuilderソリューションに勝るメリットがないため、詳細については説明しません。

  3. 3 番目のソリューションは、要件と柔軟性に応じて異なります。内の特定の文字をすべて置き換えるだけでよい場合は、コードを大幅に簡素化して、前に説明した方法をString使用できます。replace次のようになります。

    String theWord = "これがテスト文字列です"; char 文字 = 'e'; char changeTo = '*'; 文字列 displayWord = theWord.replace(文字、変更先); System.out.println("結果の単語: " + displayWord);

これにより、次の結果が出力されます。

The resulting word is: H*r* is our t*sting string

繰り返しますが、これは要件が十分に柔軟で、サンプル コードで従う「段階的な」アプローチをスキップできる場合にのみ機能します。

于 2012-08-09T04:06:32.920 に答える