在运行时指定的数组/ ArrayList的维度

时间:2013-10-23 09:15:07

标签: java arrays arraylist

假设我有一个算法,可以使用n {1,...,8}^n维度方块在n - 维度的棋盘上下棋。

对于棋盘表示,给定n - 维数组或ArrayList,算法本身在n维度中工作没有问题。问题是要在运行时指定n

有没有优雅的方法来生成和使用这样的n维棋盘?

我想到的是一个递归函数来创建一个n - 维ArrayList,返回一个整数的ArrayList,如果n == 1,并返回一个ArrayList的ArrayLists,其中第二组的每个ArrayList ArrayLists的维度为n-1

但这似乎并不优雅......

[编辑]

在我发表评论之前似乎已删除的答案建议生成一个List,其中包含大小为8的其他列表。如果我在第一个列表中使用8 ^ numberOfDimensions多个列表,这可能会有效,但是它会迫使我手动跟踪尺寸。

2 个答案:

答案 0 :(得分:3)

我认为棋盘的一个不错的数据结构可以使用Map。这样就可以根据List n整数索引查找位置:

Map<List<Integer>, BoardCell> chessboard;

BoardCell类可能也希望引用其索引,以便您可以检查哪些部分威胁到其他部分等:

class BoardCell {
   private final List<Integer> index;
   private final Figure figure;
}

生成棋盘当然是缓慢的(指数渐近),并通过枚举所有可能的棋盘位置来完成,你可以递归地进行。

这比List ListList感觉更优雅。


正如ViliamBúr在评论部分中所建议的那样,使用Map数据结构可以让您仅跟踪相关的电路板单元。这种类型的数据结构称为Sparse表示。

答案 1 :(得分:1)

我认为这不是特别优雅,但应该可以解决这个问题:

List makeBoard(int dim) {
    List res = new ArrayList(8);
    for (int i = 0 ; i != 8 ; i++) {
        if (dim != 1) {
            res.add(makeBoard(dim-1));
        } else {
            res.add(0);
        }
    }
    return res;
}

这个想法是递归地生成电路板。当dim1时,请在列表中添加八个零;否则,添加八个维度dim-1的板。