Java循环删除数组元素问题:OOP桌游玩家选棋场景解决方案咨询
解决桌游棋子重复选择+循环删除的问题
刚从C转Java确实会被Java的各种内置工具爽到,不用自己手动实现各种基础功能太香了!针对你这个面向对象桌游里,玩家选棋子不能重复、还要在循环里删除已选棋子的需求,我给你几个实用的方案,都是Java里常用的思路,比直接操作数组方便多了:
首选方案:用ArrayList代替数组
Java的数组是固定长度的,删除元素的时候得手动移动后续元素,不仅麻烦还容易出错。而ArrayList作为动态数组,内置了remove()方法,能帮你一键搞定删除操作,完美适配这种需要动态调整元素的场景。
具体实现步骤:
- 先定义你的棋子类(符合OOP思想),给棋子加上必要的属性和方法:
import java.util.Objects; class ChessPiece { private String pieceName; // 棋子名称 private int pieceId; // 唯一标识,避免同名混淆 public ChessPiece(String pieceName, int pieceId) { this.pieceName = pieceName; this.pieceId = pieceId; } // 重写equals和hashCode,方便后续判断棋子是否相同 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ChessPiece that = (ChessPiece) o; return pieceId == that.pieceId && Objects.equals(pieceName, that.pieceName); } @Override public int hashCode() { return Objects.hash(pieceName, pieceId); } // 提供getter方法供外部获取属性 public String getPieceName() { return pieceName; } public int getPieceId() { return pieceId; } }
- 在主逻辑里用
ArrayList管理可用棋子,处理玩家选择和删除操作:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class BoardGameManager { public static void main(String[] args) { // 初始化可用棋子列表 List<ChessPiece> availablePieces = new ArrayList<>(); availablePieces.add(new ChessPiece("银甲骑士", 1)); availablePieces.add(new ChessPiece("火焰法师", 2)); availablePieces.add(new ChessPiece("巨斧战士", 3)); availablePieces.add(new ChessPiece("森林游侠", 4)); Scanner scanner = new Scanner(System.in); // 模拟多玩家选择流程 for (int player = 1; player <= 3; player++) { System.out.println("\n===== 玩家" + player + "选择棋子 ====="); // 展示当前可用棋子 System.out.println("可选棋子:"); for (int i = 0; i < availablePieces.size(); i++) { System.out.println((i + 1) + ". " + availablePieces.get(i).getPieceName()); } // 获取玩家选择 System.out.print("请输入棋子序号:"); int choiceIndex = scanner.nextInt() - 1; // 转成0-based索引 // 验证选择是否合法 if (choiceIndex >= 0 && choiceIndex < availablePieces.size()) { ChessPiece selectedPiece = availablePieces.get(choiceIndex); System.out.println("玩家" + player + "选择了:" + selectedPiece.getPieceName()); // 从可用列表中删除已选棋子 availablePieces.remove(choiceIndex); } else { System.out.println("输入无效,请重新选择!"); player--; // 让当前玩家重新选择 } } scanner.close(); System.out.println("\n所有玩家选择完成,剩余未选棋子:"); for (ChessPiece piece : availablePieces) { System.out.println(piece.getPieceName()); } } }
为什么这个方案好用?
- 动态调整长度:
ArrayList会自动处理元素删除后的索引调整,不用像C语言那样手动遍历移动数组元素。 - 符合OOP:棋子作为独立类,属性和行为封装清晰,后续扩展功能(比如棋子技能、状态)也更方便。
- 代码更简洁:内置方法直接调用,减少手动实现的bug风险。
如果一定要用数组怎么办?
如果因为某些原因必须用数组,那只能通过创建新数组的方式来“删除”元素:遍历原数组,把未被选中的元素复制到新数组里。不过这种方式代码繁琐,而且每次删除都要重新创建数组,性能不如ArrayList,示例如下(不推荐):
// 假设原数组是ChessPiece[] pieces ChessPiece[] newPieces = new ChessPiece[pieces.length - 1]; int newIndex = 0; for (int i = 0; i < pieces.length; i++) { if (i != selectedIndex) { // selectedIndex是玩家选中的索引 newPieces[newIndex++] = pieces[i]; } } pieces = newPieces; // 让原数组引用指向新数组
额外小提示
从C转Java的过程中,一定要多熟悉Java集合框架(Collection Framework),像List、Set、Map这些工具类几乎能覆盖所有日常数据操作场景,比数组灵活太多,能节省大量重复造轮子的时间~
内容的提问来源于stack exchange,提问作者Barry B Benson
相关产品推荐
相关产品推荐

