如何在嵌套的ArrayLists中停止覆盖变量的循环

时间:2017-06-10 17:11:39

标签: java for-loop multidimensional-array nested-loops

最近,我一直在抨击这段代码:

    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结束,你会看到: All the tiles are on one side

我一直在尝试一些事情,但我通常会保留覆盖问题,而且我不想让它变得不必要地复杂和冗长。有谁知道这个问题的解决方案?任何帮助将不胜感激!

编辑:

我有什么: [[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)] ......]

1 个答案:

答案 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;