如何确保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
相关产品推荐
相关产品推荐

