我应该使用什么二维数据结构来支持 Java 中的固定大小?

What two dimensional data structure should I use which supports fixed size in Java?

我正在编写一个有棋盘的游戏:

 ________
|__|__|__|
|__|__|__|
|__|__|__|

我想从顶部分别推送每列中的项目:

 ________
|__|__|X_| // <-- pushToTop(2, item);
|__|__|__|
|__|__|__|

and/or从下数:

 ________
|__|__|X_|
|__|__|__|
|__|__|X_| // <-- pushToBottom(2, item);

我已经有一个使用完美运行的二维数组的实现。我的问题是我有一组函数,代码如下:

        List<Card> result = new ArrayList<>();
        for (Card[] column : board) {
            for (Card card : column) {
                // do something
            }
        }
        return result;

我想使用 Java 8 流 API[=38= 中的 map/filter/reduce ] 而不是嵌套的 for 循环来处理我的 board.

我的问题是 Collection 我可以使用什么,它像数组一样工作(固定大小,我可以根据索引添加项目,我可以在不改变数组大小的情况下删除项目)?

澄清: 主要问题是原始数组不能被视为 Collection 因此不参与 Stream 抽象。

有很多事情需要考虑:

  1. 流API合规性

    • 如果你想使用Stream接口,你要么直接实现它,要么提供一个return一个Stream实例的转换方法(更好的方法)。
  2. 内部实现

    • 在您考虑以最简单的方式理想地支持流之前,内部实现并不是那么重要,这就是以某种方式将您的数据结构表达为 Collection 实例并让 Collection 来处理转换为 Stream.
  3. 迭代顺序

    • 这不是很明显,但迭代顺序可能决定了内部数据结构格式。最简单的方法是从上到下遍历行。

如果 迭代顺序 的假设是正确的,那么最简单的方法是在内部使用 ArrayList<T> 并始终将坐标从矩阵重新计算到 ArrayList索引。流的迭代顺序将与数据结构中 Iterator 的顺序相同。

interface MyType<T> {
    void pushtoTop(int, T);
    void pushToBottom(int, T);

    Stream stream();
}

这不是 Java 8 具体的,但听起来您会受益于 Guava's Table; notably, ArrayTable

它使您可以更方便地 API 在特定坐标处添加和检索事物,并且由于您在获得对象时就知道世界的大小,因此您不必担心很多关于 space 或创建一堆笨拙的对象来绑定所有内容。