Повторная инициализация итератора ArrayList не работает - PullRequest
0 голосов
/ 04 февраля 2012

Учитывая следующее:

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

Я пытаюсь повторно использовать итератор, но получаю ошибку компиляции "Duplicate local variable 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 

Ответы [ 5 ]

3 голосов
/ 04 февраля 2012

Не объявляйте переменную повторно;просто назначьте его.

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

Вы должны быть осторожны с поведением вложенного цикла.Вы действительно хотите, чтобы следующий блок

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

действительно проверял это условие?

while (iterator.hasNext() && (this.m_rounds > 0)) { ... }
1 голос
/ 04 февраля 2012

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


    }

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

if(humanSide) {

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

} else {

  //Algorithm based awesome move.

}
1 голос
/ 04 февраля 2012

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

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

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

... и у вас никогда не кончатся игроки.

1 голос
/ 04 февраля 2012

Вы поместили 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 голосов
/ 04 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...