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

Java数组变更记录与动态棋盘数组扩容及代码报错解决

问题解决与实现方案

一、修复代码报错并完成二维数组转动态列表

你的代码报错有两个核心原因:

  1. Prueba 是空的 ArrayList,直接调用 Prueba.get(i) 会抛出 IndexOutOfBoundsException,因为还未添加任何子列表元素。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:55:15