Как использовать один и тот же итератор снова и снова? - PullRequest
3 голосов
/ 03 февраля 2012

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

// это часть какого-то большого метода //

        ArrayList<String> players = this.m_maze.getPlayers();

    // define the first node to be the human player , and pop him from the list 
    // the rest of the nodes are the computer side 

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

    // human side 
    String humanPlayer = iterator.next();


    // controller - start a game between the players , at least two players are playing 
    while (this.m_rounds > 0)  
    {


        String[] choices = this.m_view.getChoiceFromUser();

        int usersChoice = Integer.parseInt(choices[0]);

        switch (usersChoice)
        {
            case 1:   // then user chose to stay put 
            {

            }

            case 2:   // then take the next step
            {
                // let the user make his move

                this.m_maze = this.m_model.makeSomeMove(choices[1],humanPlayer,true);

                // print out the maze for visualization
                this.m_view.drawMaze(m_maze);

                // controller - reduce the number of current rounds for the current game 
                this.m_rounds--; 
            }

            case 31:   // then user asked for the closest treasure
            {
                //  put some code here later on
            }


            case 32:   // then user asked for the nearest room 
            {
            //  put some code here later on
            }

        }  // end switch case

    } // end while 

(1). Как я могу поместить в humanPlayer первый элементArrayList после каждого вызова makeSomeMove?

(2). Можно ли повторно использовать итератор?так как я использую hasnext() и next() ...?

Большое спасибо Рон

Ответы [ 3 ]

7 голосов
/ 03 февраля 2012

Если вы хотите повторно использовать итератор, вы должны повторно инициализировать его.

Вы должны выполнить Iterator<String> iterator = players.iterator(); всякий раз, когда хотите повторно использовать итератор.

0 голосов
/ 03 февраля 2012

Использовать массив Player[]. Если вам не нужно удобно увеличивать и уменьшать размер списка, использование массива делает доступ к любому элементу в любое время простым и читабельным.

Кроме того, с массивом вы все еще можете использовать синтаксис foreach:

Player[] players = new Player[9];
...
for (Player player : players) {
    // do something
}
0 голосов
/ 03 февраля 2012

Простой итератор был бы бесполезен для этого, так как он застрял бы в последнем элементе.Вам нужен ListIterator, чтобы вы могли переместить его обратно в начало.

Редактировать: однако, лучше не пытаться делать это, поскольку вы не сможете изменить список (если вы это сделаете, вы получите исключение одновременной модификации)

...