2012-02-04 16 views
0

を動作しません:再初期化は、次を考える

// get the list of the players , in order to start the game 
    ArrayList<String> players = this.m_maze.getPlayers(); 
    // human side 
    String humanPlayer = iterator.next(); 
    String computerPlayer = null; 
    // define iterator for the players 

    Iterator<String> iterator = players.iterator();  
    boolean humanSide = true ,computerSide = false; // assume the human player is starting the game 


    // controller - start a game between the players , at least two players are playing 

    while (this.m_rounds > 0) 
    { 

     if (humanSide == false && computerSide == true) // then this is the turn of the human side 
     { 
      if (iterator.hasNext() == false) 
      { 
       // reinitialize the iterator 
       Iterator<String> iterator = players.iterator(); 

      } 
      while (iterator.hasNext()) 


         // more code 

私はイテレータを再利用しようとするが、私は「重複ローカル変数イテレータ」コンパイル・エラーが発生します。どのようにしてそのイテレータを再利用できますか? おかげで、ロン

EDIT:あなたのループでIterator<String> iterator = players.iterator();を入れている

  if (iterator.hasNext() == false) 
      { 
       // reinitialize the iterator 
       iterator = players.iterator(); 

      } 
      while (iterator.hasNext()) 
      { 
       computerPlayer = iterator.next(); 

       // computer decides what would be his next move , between 1 - 3 
+1

これは循環的に繰り返しているように聞こえます。実際に周期的なデータ構造を使用していると考えましたか? –

+0

これは非常に良いアイデアです。私はそれを考慮に入れます、ありがとう! – ron

答えて

3

はいけない変数を再宣言します。ちょうどそれを割り当てます。

if (iterator.hasNext() == false) { 
    iterator = players.iterator(); 
} 

ネストループの動作には注意が必要です。あなたの本当の目的は、次のブロックを持つことですか

while (iterator.hasNext()) { ... } 

実際にこの状態を確認しますか?

while (iterator.hasNext() && (this.m_rounds > 0)) { ... } 
1

だから、名前がiteratorの変数を作成しようとするたびに。

が同じように...ループの外にそれの宣言を置く

Iterator<String> iterator;  //here **** 
while (this.m_rounds > 0) 
    { 

    if (humanSide == false && computerSide == true) // then this is the turn of the human side 
    { 
     if (iterator.hasNext() == false) 
     { 
      // reinitialize the iterator 
      iterator = players.iterator(); 

     } 
     while (iterator.hasNext()) 
+0

これは、 'iterator'が' hasNext() 'の呼び出しの前に値を割り当てられていないので、' NullPointerException'をスローします。 – cheeken

+0

@cheekenそれでは、彼はすでにコードに従った例外bcozを投げています。hasNext()の前にイテレータに値を割り当てていません。 – gprathour

0

わかりました、ちょうどその反復子を再利用する際Iterator<String>は、意味があり、ちょうど書き込み削除:

iterator = players.iterator();はあなたのすべてをありがとう!

1

私はグーグルがあなたがほしいと思うものがほとんどだと思います。Iterators#cycle

はこのようにそれを使用します。

Iterator<String> iterator = Iterators.cycle(players.iterator()); 

...、あなたは選手を使い果たすことは決してありません。

1

このようなイテレータを使用しないでください。それは古いものをやり直すことができます。有名なIterator "i"を使用することを意味します。さらに、コードはより賢明に見えます。

while(m_rounds > 0){ 

     if(i == players.size()) { 
      i = 0; 
     } 

     currentPlayer = players.get(i); 

     //Do what you want to do with the current player... 

     ... 

     //Next 
     i++; 


    } 

小さな提案ですが、本当に両方のフラグが必要ですか?私は人間とコンピュータサイドを意味しますか?ただ1つだけでは不十分でしょうか?あなたのif-elseブロックはもっと簡単で明確に見えます:

if(humanSide) { 

    //Hope this move wouldn't crush your logic. 

} else { 

    //Algorithm based awesome move. 

} 
+0

あなたは正しいです。私はそれをやろう! 10倍。 – ron

関連する問題