Java数组变更记录与动态棋盘数组扩容及代码报错解决
问题解决与实现方案
一、修复代码报错并完成二维数组转动态列表
你的代码报错有两个核心原因:
Prueba是空的ArrayList,直接调用Prueba.get(i)会抛出IndexOutOfBoundsException,因为还未添加任何子列表元素。Prueba.get(i).get(y)返回的是String类型,而String类没有add()方法,这就是报错的根源。
正确的转换代码应该先为每一行创建子列表,再填充元素:
String[][] TablaInicial = new String[17][17]; // 先初始化二维数组内容(示例) for (int i = 0; i < 17; i++) { for (int y = 0; y < 17; y++) { TablaInicial[i][y] = "(" + i + "," + y + ")"; } } List<List<String>> Prueba = new ArrayList<>(); // 先添加空的子列表到Prueba中 for (int i = 0; i < TablaInicial.length; i++) { Prueba.add(new ArrayList<>()); // 填充当前行的元素 for (int y = 0; y < TablaInicial[i].length; y++) { Prueba.get(i).add(TablaInicial[i][y]); } }
也可以用更简洁的方式直接把数组转成列表:
import java.util.Arrays; // ... List<List<String>> Prueba = new ArrayList<>(); for (String[] row : TablaInicial) { Prueba.add(new ArrayList<>(Arrays.asList(row))); }
转换完成后,Prueba 就是动态二维列表,后续可通过 Prueba.add(new ArrayList<>()) 扩容行,或通过 Prueba.get(rowIndex).add("新元素") 扩容某一行的列,完全不会丢失原有数据。
二、记录数组/列表的所有变更情况
要记录所有变更,可封装一个带日志功能的容器类,每次执行增删改操作时自动记录操作详情,示例实现如下:
变更日志实体类
import java.util.Date; class ChangeLog { private Date timestamp; private String operation; // 操作类型:ADD_ROW、ADD_COL、UPDATE、DELETE private int rowIndex; private int colIndex; private String oldValue; private String newValue; public ChangeLog(String operation, int rowIndex, int colIndex, String oldValue, String newValue) { this.timestamp = new Date(); this.operation = operation; this.rowIndex = rowIndex; this.colIndex = colIndex; this.oldValue = oldValue; this.newValue = newValue; } @Override public String toString() { return String.format("[%s] %s - 位置(%d,%d) | 旧值: %s | 新值: %s", timestamp, operation, rowIndex, colIndex, oldValue, newValue); } }
带日志的国际象棋棋盘容器
import java.util.ArrayList; import java.util.List; import java.util.Arrays; class ChessBoard { private List<List<String>> board; private List<ChangeLog> changeLogs; public ChessBoard(String[][] initialBoard) { this.board = new ArrayList<>(); this.changeLogs = new ArrayList<>(); // 初始化棋盘 for (String[] row : initialBoard) { this.board.add(new ArrayList<>(Arrays.asList(row))); } } // 新增一行 public void addRow(List<String> newRow) { board.add(newRow); changeLogs.add(new ChangeLog("ADD_ROW", board.size()-1, -1, null, newRow.toString())); } // 在指定行新增一列 public void addCol(int rowIndex, String value) { board.get(rowIndex).add(value); changeLogs.add(new ChangeLog("ADD_COL", rowIndex, board.get(rowIndex).size()-1, null, value)); } // 更新指定位置的值 public void updateCell(int rowIndex, int colIndex, String newValue) { String oldValue = board.get(rowIndex).get(colIndex); board.get(rowIndex).set(colIndex, newValue); changeLogs.add(new ChangeLog("UPDATE", rowIndex, colIndex, oldValue, newValue)); } // 删除指定位置的元素 public void deleteCell(int rowIndex, int colIndex) { String oldValue = board.get(rowIndex).remove(colIndex); changeLogs.add(new ChangeLog("DELETE", rowIndex, colIndex, oldValue, null)); } // 获取所有变更日志 public List<ChangeLog> getChangeLogs() { return new ArrayList<>(changeLogs); } // 获取当前棋盘 public List<List<String>> getBoard() { return new ArrayList<>(board); } }
使用示例
public class Main { public static void main(String[] args) { // 初始化17x17的棋盘 String[][] initial = new String[17][17]; for (int i = 0; i < 17; i++) { for (int y = 0; y < 17; y++) { initial[i][y] = "-"; } } ChessBoard board = new ChessBoard(initial); // 执行操作 board.updateCell(0, 0, "R"); // 放置黑车 board.addCol(16, "X"); // 给最后一行新增一列 board.addRow(new ArrayList<>(List.of("-", "-", "K"))); // 新增一行并放置国王 // 打印所有变更日志 for (ChangeLog log : board.getChangeLogs()) { System.out.println(log); } } }
这样每次对棋盘的修改都会被完整记录,可随时查看所有变更历史。
内容的提问来源于stack exchange,提问作者Naheshiko
相关产品推荐
相关产品推荐

