最近,我一直在抨击这段代码:
for(int i = 0; i < cols; i++) {
for(int j = 0; j < rows; j++) {
SqrTileNormal temp = new SqrTileNormal(i, j, this, ID.Tile);
setTile(temp);
}
}
//additional info
public void setTile(Tile tile) {
int xPosGrid = tile.getXPosGrid();
int yPosGrid = tile.getYPosGrid();
System.out.println("Coords: (" + xPosGrid + ", " + yPosGrid + ")");
this.tiles.get(xPosGrid).set(yPosGrid, tile);
}
//how the nested array looks like.
protected List<ArrayList<Tile>> tiles;
它是构造函数的一部分,它应该用SqrTileNormal
填充二维数组。我发现了问题所在:for循环的每次迭代都会不断重写之前的迭代,所以它们都会以相同的xPosGrid
结束,你会看到:
我一直在尝试一些事情,但我通常会保留覆盖问题,而且我不想让它变得不必要地复杂和冗长。有谁知道这个问题的解决方案?任何帮助将不胜感激!
编辑:
我有什么: [[null,null,null ...] [null,null,null ...] [(null,null,null ...]
我想要的是什么:
我得到了什么: [[(10,0),(10,1),(10,2)......] [(10,0),(10,1),(10,2)......] [(10,0 ),(10,1),(10,2)] ......]
答案 0 :(得分:0)
问题在于你如何初始化this.tiles
,你没有展示你是如何做到的,但可能你只设置了一个数组列表,所以实际上你有十倍的相同值列表。
您的this.tiles
初始化应该如下:
private static List<List<Tile>> getListOfLists() {
int numcol = 5;
int numrow = 5;
List<List<Tile>> bidiArray = new ArrayList<>();
for (int i = 0; i < numcol; i++) {
List<String> sublist = new ArrayList<>();
bidiArray.add(sublist);
for (int j = 0; j < numrow; j++) {
sublist.add(null);
}
}
return bidiArray;
}
但事实上,处理固定数量的列和行我宁愿使用如下的数组:
Tile[][] bidiArray = new Tile[numcol][numrow];
然后像这样设置:
this.tiles[xPosGrid][yPosGrid]= tile;