You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
        }
    }
});

关键说明

  1. 只有当所有玩家都完成第一次掷骰子(playerDiceMap.size()等于原玩家列表长度),才会生成排序后的玩家列表,确保排序基于完整的点数数据。
  2. 用isOrderDecided变量切换两种状态:掷骰子阶段用原列表,正式回合阶段用排序后的列表。
  3. 用Lambda表达式简化了原排序代码的Comparator写法,更简洁直观。

内容的提问来源于stack exchange,提问作者servidor ocaloka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:05:36