Java中如何将排序后的HashMap转为玩家列表并按序迭代?
简单实现方案
核心思路
先收集所有玩家的骰子点数,生成按点数从大到小排序的玩家列表,之后的回合就按这个列表顺序迭代玩家。
步骤1:添加类成员变量
在你的Activity/Fragment类里新增两个成员变量,用来保存排序后的玩家列表和标记排序是否完成:
// 保存排序后的玩家列表 private List<PlayerOffline> sortedPlayers; // 标记是否已经确定玩家回合顺序 private boolean isOrderDecided = false;
步骤2:修改排序方法triarOrdre
调整方法逻辑,只在所有玩家都掷完骰子后生成排序后的玩家列表:
private void triarOrdre(PlayerOffline currentPlayer, HashMap<String, Integer> playerDiceMap) { // 补充rollValue局部变量声明(原代码遗漏) int rollValue = rollDice(); if (currentPlayer.getPrimeraTirada() == 0) { currentPlayer.setPrimeraTirada(rollValue); playerDiceMap.put(currentPlayer.getName(), rollValue); currentPlayer.setaTiratPrimeraTirada(true); } // 所有玩家完成第一次掷骰子后,才生成排序后的玩家列表 if (playerDiceMap.size() == playersIntent.size()) { List<Map.Entry<String, Integer>> sortedEntries = new ArrayList<>(playerDiceMap.entrySet()); // 按骰子点数从大到小排序(用Lambda简化原Comparator写法) sortedEntries.sort((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())); // 组装排序后的PlayerOffline列表 sortedPlayers = new ArrayList<>(); for (Map.Entry<String, Integer> entry : sortedEntries) { String playerName = entry.getKey(); // 从原玩家列表中匹配对应Player对象 for (PlayerOffline player : playersIntent) { if (player.getName().equals(playerName)) { sortedPlayers.add(player); break; } } Log.e("Sorted Player Dice Map:", currentPlayer.getColor() + " " + playerName + " - " + entry.getValue()); } // 标记顺序已确定 isOrderDecided = true; } }
步骤3:修改点击事件逻辑
区分「未确定顺序」和「已确定顺序」两种状态,分别用原列表和排序后的列表迭代玩家:
iv_dau.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlayerOffline currentPlayer; if (!isOrderDecided) { // 未确定顺序时:按原列表循环,让每个玩家完成第一次掷骰子 currentPlayer = playersIntent.get(currentPlayerIndex); if (!currentPlayer.isaTiratPrimeraTirada()) { triarOrdre(currentPlayer, playerDiceMap); // 切换下一个需要掷骰子的玩家 currentPlayerIndex = (currentPlayerIndex + 1) % playersIntent.size(); // 所有玩家掷完后,重置索引到排序后列表的第一个玩家 if (isOrderDecided) { currentPlayerIndex = 0; } return; } } else { // 已确定顺序时:使用排序后的玩家列表 currentPlayer = sortedPlayers.get(currentPlayerIndex); } // 执行移动棋子逻辑 movePiece(currentPlayer); // 切换下一个玩家,根据状态选择对应列表长度 if (isOrderDecided) { currentPlayerIndex = (currentPlayerIndex + 1) % sortedPlayers.size(); } else { currentPlayerIndex = (currentPlayerIndex + 1) % playersIntent.size(); } } });
关键说明
- 只有当所有玩家都完成第一次掷骰子(
playerDiceMap.size()等于原玩家列表长度),才会生成排序后的玩家列表,确保排序基于完整的点数数据。 - 用
isOrderDecided变量切换两种状态:掷骰子阶段用原列表,正式回合阶段用排序后的列表。 - 用Lambda表达式简化了原排序代码的Comparator写法,更简洁直观。
内容的提问来源于stack exchange,提问作者servidor ocaloka
相关产品推荐
相关产品推荐

