我有2D ArrayList和方法public void set(int row, int col, T x)
,可将this.element
更改为x
。当我尝试运行我的代码时它会给我java.lang.ArrayIndexOutOfBoundsException
而我不明白为什么因为我已经初始化了我的代码:
Board board = new Board(-2,3,-4,3,"xxx");
其中构造函数值为
new Board(int minRow, int maxRow, int minCol, int maxCol, T e)
java.lang.ArrayIndexOutOfBoundsException
发生在行中的set()
方法中:
if(myBoard.get(row).get(col).equals(this.element))
为什么我会收到该错误?我是否正确访问ArrayList中的行和列号?
我的toString()
代表
答案 0 :(得分:1)
执行board.set(-1, 0, "A");
时,您尝试访问ArrayList
索引-1处的元素。 row
中的set()
为-1,您基本上会在myBoard.get(-1)
语句中调用if
。
您需要记住ArrayList
在索引方面是基于0的。要解决此问题,请从-1减去最小索引以获取正确的索引。这也适用于列索引。例如,给定
Board board = new Board(-2,3,-4,3,"xxx");
你需要做
int row = (-1) - (-2); //row you want - lowest row (row at index 0 in the ArrayList)
int col = (0) - (-4); //col you want - lowest col (col at index 0 in the ArrayList)
board.set(row, col, "A");
答案 1 :(得分:1)
负索引对于Java中的所有有序数据结构都是无效的。你的Board
类应该将索引重写为正数,以隐藏调用者的这个时髦逻辑:
public void set(int virtualRow, int virtualCol, T x) {
int row = translateIndex(minRow, virtualRow, maxRow);
int col = translateIndex(minCol, virtualCol, maxCol);
// this.expandToInclude(row, col);
if (myBoard.get(row).get(col).equals(this.element)) {
myBoard.get(row).set(col, x);
RowColStack<T> temp = new RowColStack<T>(row, col, x);
undoStack.add(temp);
}
}
private int translateIndex(int min, int index, int max) {
if (index< min || row > max) throw new ArrayOutOfBoundException();
return index - min;
}
答案 2 :(得分:0)
几点意见:
ArrayList
可能会简单得多。java.lang.ArrayIndexOutOfBoundsException
。您可以使用类似于以下的逻辑初始化数组列表:
for(int i = 0; i < nRows; i++) {
rowList = new ArrayList();
myboard.add(rowList);
for(int j = 0; j < nCols; j++)
rowList.add(null);
}
}
将此视为伪代码,并以此为基础。