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

如何确保Java ArrayList中多名玩家的输入名称不重复(大富翁游戏)

实现大富翁游戏玩家名称唯一性的方案

下面提供两种实用方案,基于你现有代码结构实现玩家名称的唯一性校验:

方案一:基于现有ArrayList直接检查

在创建每个玩家前,遍历已添加的玩家列表,检查输入的名称是否重复。如果重复,提示用户重新输入,直到输入合法名称为止。

修改后的createPlayers方法代码:

// in monopoly.java
static ArrayList<Player> createPlayers(int numPlayers){
    ArrayList<Player> players = new ArrayList<>();

    for(int i = 1; i <= numPlayers; i++){
        String playerName;
        boolean isNameUnique;
        do {
            System.out.print("Player " + i + " name: ");
            playerName = Input.read().trim(); // 去除首尾空格,避免无意义重复
            isNameUnique = true;

            // 检查名称是否为空
            if(playerName.isEmpty()){
                System.out.println("名称不能为空,请输入有效名称!");
                isNameUnique = false;
                continue;
            }

            // 遍历现有玩家,检查名称是否重复
            for(Player p : players){
                if(p.getName().equals(playerName)){
                    System.out.println("该名称已被使用,请输入新的名称!");
                    isNameUnique = false;
                    break;
                }
            }
        } while(!isNameUnique);
        
        players.add(new Player(playerName));
    }

    return players;
}

方案二:用HashSet优化重复检查效率

如果玩家数量较多,遍历ArrayList的效率会随玩家数增加下降。可以用HashSet存储已使用的名称,利用其O(1)的查询效率快速判断重复。

修改后的createPlayers方法代码:

// in monopoly.java
import java.util.HashSet; // 需要导入HashSet类

static ArrayList<Player> createPlayers(int numPlayers){
    ArrayList<Player> players = new ArrayList<>();
    HashSet<String> usedNames = new HashSet<>(); // 记录已使用的名称

    for(int i = 1; i <= numPlayers; i++){
        String playerName;
        boolean isNameUnique;
        do {
            System.out.print("Player " + i + " name: ");
            playerName = Input.read().trim();
            isNameUnique = true;

            if(playerName.isEmpty()){
                System.out.println("名称不能为空,请输入有效名称!");
                isNameUnique = false;
            } else if(usedNames.contains(playerName)){
                System.out.println("该名称已被使用,请输入新的名称!");
                isNameUnique = false;
            }
        } while(!isNameUnique);
        
        usedNames.add(playerName);
        players.add(new Player(playerName));
    }

    return players;
}

可选优化:忽略大小写的重复校验

如果希望"Alice"和"alice"被视为同一名称,可以修改校验逻辑:

  • 方案一中,将比较条件改为p.getName().equalsIgnoreCase(playerName)
  • 方案二中,存储和查询时统一转成小写:
    usedNames.add(playerName.toLowerCase());
    // 查询时
    else if(usedNames.contains(playerName.toLowerCase()))
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:01:18