1
String playerlist;

for(Player p : allplayers){
    playerlist += p.getDisplayName() + ", ";
}

sendMessage(playerlist);

どうすればこれを達成できますか? for ループ内に変数が必要で、ループの外で変数にアクセスする必要があります。

ありがとう、そしてこれが非常に初心者の質問であれば申し訳ありません。私はそれを理解することはできません。

4

3 に答える 3

7

ループ外で変数を初期化すると、次のようになります。

String playerlist = "";

ただし、文字列を操作しているため、文字列の代わりにStringBuilderを使用する方がはるかに優れています。理由は、文字列が不変であり、for ループ内の各反復で新しい文字列を作成することです。ただし、StringBuilder は可変でありappend、操作をサポートするさまざまなオーバーロードされたメソッドがあります。StringBuilder を使用すると、コードは次のようになります。

StringBuilder playerlist = new StringBuilder();

for (Player p : allplayers) {
    playerlist.append(p.getDisplayName()).append(", ");
}
于 2012-05-02T04:00:34.750 に答える
7

あなたは近くにいます。最初の行を次のように変更する必要があります

String playerlist = "";

Java では、変数を初期化する前に使用することは違法です。

playerlist += p.getDisplayName() + ", ";

脱糖(*)~

String temp = playerlist;
playerlist = temp + (p.getDisplayName() + ", ");

を初期化するplayerlistと、その内容を一時変数に読み取ってから更新できplayerlistます。

ただし、より高いレベルの提案が 2 つあります。

  1. 一部のライブラリ ( .NETおよびPythonプラットフォームと同様) が提供するように、使用可能な結合メソッドがある場合は、結合を使用するだけで読みやすくなります。
  2. ただし、利用可能な join メソッドがない場合 (私の知る限り、Java 標準ライブラリにはそのようなものはありません)、@anubhava の提案と一致するStringBuilderを使用する必要があります。多数の文字列でパフォーマンスが向上し、コードが理解しやすくなり、双方にとってメリットがあります。

編集: @edalorzo がコメントで正しく言及しているように、ローカル変数を初期化しない場合にのみエラーが発生し、静的フィールドとインスタンス フィールドの両方が自動的に初期化されます。具体的には、数値型 ( intlongdoubleなど) は 0 に初期化され、ブール値は に初期化されfalse、参照型は に初期化されnullます。

仕様では、フィールドの自動初期化が明示的に記述されているため、信頼できますが、それが必要になることはめったにありません。通常、後で使用するときに、フィールドのデフォルト以外の値が必要になります。これは、nullそれほど有用ではないためです (そして、多くの言語、特に標準 ML のような関数型言語では、まったく使用しませんnull)。したがって、コンストラクターでオブジェクトのすべてのフィールドを初期化することをお勧めします。


(*): 上に示した「脱糖」はほぼ正確です。実際にplayerlistは、一度だけ評価されるため、この特定のプログラムの動作には影響しません。

于 2012-05-02T03:58:52.373 に答える
0

ローカル変数playerlistが初期化されていない可能性があります。Javaforループステートメントでは、ローカル変数は最初に初期化してからループブロックで使用する必要があります。を初期化する必要がありますplayerlist。次のコードを使用できます。

String playerlist = null;

for(Player p : allplayers)
{
    playerlist += p.getDisplayName() + ", ";
}

sendMessage(playerlist);

ただし、次のコードを使用することをお勧めします。

StringBuilder playerlist = new StringBuilder();

for(Player p : allplayers)
{
    playerlist.append(p.getDisplayName()).append(", ");
}
sendMessage(playerlist.toString());
于 2012-05-02T04:05:23.490 に答える