Java 需要一种在地图上连续循环/迭代的方法吗

Java 需要一种在地图上连续循环/迭代的方法吗,java,loops,continuous,Java,Loops,Continuous,我正在用java构建一个游戏,我有一个玩家对象的“地图”。我有一个叫做endOfTurn的方法,当玩家想要完成他们的回合时调用它,它将“currentPlayerTurn”字段设置为地图中的下一个玩家。然而,一旦我到达我的地图的尽头,我希望它回到地图上的第一个玩家那里,一次又一次地旋转。有没有办法做到这一点?也是的,玩家的数据结构需要是一张地图 public class Game { private Map<String,Player> players; private Playe

我正在用java构建一个游戏,我有一个玩家对象的“地图”。我有一个叫做endOfTurn的方法,当玩家想要完成他们的回合时调用它,它将“currentPlayerTurn”字段设置为地图中的下一个玩家。然而,一旦我到达我的地图的尽头,我希望它回到地图上的第一个玩家那里,一次又一次地旋转。有没有办法做到这一点?也是的,玩家的数据结构需要是一张地图

public class Game {

private Map<String,Player> players;
private Player currentPlayerTurn;

public boolean EndOfTurn(Player currentPlayerTurn) {
    //need to set this.currentPlayerTurn to the next player in the Map

}
公共类游戏{
私人地图播放器;
私人玩家currentPlayerTurn;
公共布尔内接turn(Player currentPlayerTurn){
//需要将this.currentPlayerTurn设置为地图中的下一个玩家
}

我研究过使用迭代器,但它似乎没有重置功能或“循环”模式。有什么想法吗?

我认为最简单的选择是:

while (!done) {
   // iterate once around your list
}
如果你的玩家需要被关在
地图中
,那么我不会通过引入新的结构来使事情复杂化


你可能想考虑的是,如果一个球员又转了一圈,会发生什么(这会发生吗?)如果是这样的话,迭代器将不是一个天生的适合对象,也许你需要某种
TurnManager
对象来选择下一个玩家。我不会试图将游戏的行为与容纳玩家的数据结构联系起来,而是将其抽象成一个明确知道如何处理的组件。

通常,你会ld有一个外部循环,它迭代调用此方法的玩家

while(playingGame) {
   for(Player player: players.values()) {
      player.takeTurn();
      endOfTurn(player);
   }
}

你总是可以从映射中创建一个新的迭代器。我的意思是,“重置”迭代器的方法就是创建一个新的迭代器

Iterator<Map.Entry<String,Player>> it = players.entrySet().iterator();

//...

if(!it.hasNext())
    it=players.entrySet().iterator()
Iterator it=players.entrySet().Iterator();
//...
如果(!it.hasNext())
it=players.entrySet().iterator()
让我试试

public class Game {

    private Map<String,Player> players;
    private Player currentPlayerTurn;
    private Iterator<Map.Entry<String,Player>> itPlayers;

    public boolean EndOfTurn(Player currentPlayerTurn) {
         if(itPlayers == null || !itPlayers.hasNext()){
           itPlayers=players.entrySet().iterator();   
         }
         currentPlayerTurn=itPlayers.next().getValue();
    }

}
公共类游戏{
私人地图播放器;
私人玩家currentPlayerTurn;
私有迭代器;
公共布尔内接turn(Player currentPlayerTurn){
if(itPlayers==null | |!itPlayers.hasNext()){
itPlayers=players.entrySet().iterator();
}
currentPlayerTurn=itPlayers.next().getValue();
}
}

您可以创建类似于链表节点的结构。如果一轮结束,endOfTurn()将返回true,否则将返回false

   Player {
    String name;
    boolean dealer;
    Payer nextPlayer;

    // constructor, getters and setters for fields

    }

    public class Game {

    private Map<String,Player> players;
    private Player currentPlayerTurn;

    public boolean endOfTurn(Player currentPlayerTurn) {
       currentPlayerTurn = currentPlayerTurn.getNextPlayer();

       if(currentPlayerTurn.isDealer())
          return true;
        else
          return false;
    }
播放器{
字符串名;
布尔经销商;
付款人下一层;
//字段的构造函数、getter和setter
}
公开课游戏{
私人地图播放器;
私人玩家currentPlayerTurn;
公共布尔内接turn(Player currentPlayerTurn){
currentPlayerTurn=currentPlayerTurn.getNextPlayer();
如果(currentPlayerTurn.isDealer())
返回true;
其他的
返回false;
}

你需要一个循环链接列表。
LinkedHashMap
可以做这项工作,它保持了你进入玩家的顺序。循环链接列表可以工作,但我需要它是一个地图。我知道他已经尝试过了,但它没有他想要的循环行为。他写道:“我已经考虑过使用迭代器,但这似乎没有什么效果。”重置“循环”模式