【问题标题】:Dimension of array / ArrayList specified at runtime运行时指定的数组/ArrayList 的维度
【发布时间】:2013-10-23 09:15:07
【问题描述】:

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

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

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

我想到的是一个递归函数,用于创建一个n 维 ArrayList,如果 n == 1 返回一个整数 ArrayList,并返回一个 ArrayList 的 ArrayList,其中第二组 ArrayLists 的每个 ArrayList 都有维度 @ 987654330@.

但这似乎一点都不优雅……

[编辑]

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

【问题讨论】:

    标签: java arrays arraylist


    【解决方案1】:

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

    Map<List<Integer>, BoardCell> chessboard;
    

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

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

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

    这感觉比 ListListList 等更优雅。


    正如 Viliam Búr 在 cmets 部分所建议的那样,使用 Map 数据结构可以让您只跟踪相关的板单元。这种类型的数据结构称为Sparse 表示。

    【讨论】:

    • 优雅,并且通过良好的实现,如果数组大部分为空,它可能会节省大量内存。棋盘上的“空”值应该存储在地图中;相反,没有键应被解释为在给定位置具有“空”值的地图。那么即使你的棋盘上有 100 个维度和 1000 个棋子,你的内存也不会用完!现在要正确执行此操作,应将整个 Map 封装在一个类中,该类将提供访问器方法。在没有键的情况下,读取方法应返回“null”值;并写“null”应该删除密钥。
    • 谢谢cyon和Viliam Búr,我想这正是我所需要的!
    【解决方案2】:

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

    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 时,在列表中添加八个零;否则,添加8个尺寸dim-1的板。

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2010-09-06
      • 2023-03-11
      • 2012-01-18
      • 2017-05-13
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多