【问题标题】:Need a way of continuously looping/iterating around a Map需要一种围绕地图连续循环/迭代的方法
【发布时间】:2012-11-06 11:29:07
【问题描述】:

我正在用 java 构建一个游戏,并且我有一个 Player 对象的“地图”。我有一个名为 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

}

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

【问题讨论】:

  • 你需要一个循环链表。
  • LinkedHashMap 可以完成这项工作,它会保持您输入播放器的顺序。
  • 循环链表可以,但我需要它作为地图。

标签: java loops continuous


【解决方案1】:

通常,您会有一个外循环,它会遍历调用此方法的播放器。

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

【讨论】:

    【解决方案2】:

    我认为您最简单的选择是:

    while (!done) {
       // iterate once around your list
    }
    

    如果您的球员需要被关押在Map,那么我不会通过引入新结构来使事情复杂化。

    您可能要考虑的是,如果玩家获得另一个回合会发生什么(会发生这种情况吗?)。如果是这样,迭代器将不会自然而然地适合,也许您需要某种TurnManager 对象来选择下一个玩家。我不会尝试将游戏的行为与保存玩家的数据结构联系起来,而是将其抽象为一个明确知道如何处理的组件。

    【讨论】:

      【解决方案3】:

      您可以创建类似于链表节点的结构。如果一轮结束,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;
          }
      

      【讨论】:

        【解决方案4】:

        您始终可以从 Map 中创建一个新的迭代器。我的意思是,“重置”迭代器的方式是创建一个新的。

        Iterator<Map.Entry<String,Player>> it = players.entrySet().iterator();
        
        //...
        
        if(!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();
            }
        
        }
        

        【讨论】:

        • 我知道他已经尝试过了,但它没有他想要的循环行为
        • 他写道:'我已经研究过使用迭代器,但这似乎没有重置'循环'模式'
        猜你喜欢
        • 2020-02-07
        • 2011-12-05
        • 2020-08-18
        • 1970-01-01
        • 2020-06-18
        • 2011-10-20
        • 2020-01-28
        • 1970-01-01
        • 2020-03-24
        相关资源
        最近更新 更多