2012-02-04 3 views
0

Учитывая следующее:Повторная инициализация итератора ArrayList не работает

// 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:

  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<String> iterator = players.iterator(); в цикле.

Так что каждый раз он пытается создать переменную с именем 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

Это вызовет 'NullPointerException', поскольку' iterator' не присваивается значение до вызова 'hasNext()'. – cheeken

+0

@cheeken, если это так, тогда он уже будет выбрасывать исключение bcoz в соответствии с его кодом, который он не присвоил итератору до hasNext() – gprathour

0

Хорошо просто удалить Iterator<String>, смысл, при повторном использовании, что итератор просто написать: iterator = players.iterator();

Спасибо всем !!

1

Я думаю, что google guava имеет то, что вы хотите, с Iterators#cycle.

Используйте это так:

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

... и вы никогда не будете запускать из игроков.

1

Не используйте итераторы, как это, это может испортить вещи, просто сделайте это по-старому, я имею в виду использование знаменитого мистера Итератора «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++; 


    } 

Небольшое предложение, действительно ли вам нужны оба флага, я имею в виду человеческий сундук и компьютер? Не будет использовать только один достаточно? Ваш блок if-else будет выглядеть намного проще и понятнее:

if(humanSide) { 

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

} else { 

    //Algorithm based awesome move. 

} 
+0

Вы правы. Я это сделаю! 10x. – ron