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

时间:2015-01-27 23:21:30

标签: java data-structures collections

我正在写一个有董事会的游戏:

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

我想将每列中的项目与顶部分开:

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

和/或从底部:

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

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

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

我希望使用 Java 8 Stream API 中的map / filter / reduce而不是嵌套的for循环来处理我的{{1 }}

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

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

2 个答案:

答案 0 :(得分:2)

这不是特定于Java 8的,但听起来你会受益于Guava's Table;值得注意的是,ArrayTable

它为您提供了一个更方便的API来添加和检索特定坐标处的内容,并且由于您在获得对象时知道了世界的大小,因此您不必担心空间或创建一堆尴尬的物品将一切都捆绑在一起。

答案 1 :(得分:1)

有许多事情需要考虑:

  1. 流API合规性

    • 如果要使用Stream接口,则必须直接实现它或提供返回Stream实例的转换方法(更好的方法)。
  2. 内部实施

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

    • 这不是直接明显的,但迭代顺序可能决定了内部数据结构格式。最简单的方法是从上到下迭代行。
  4. 如果迭代次序的假设是正确的,那么最简单的方法是在内部使用ArrayList<T>并始终将矩阵中的坐标重新计算到ArrayList索引中。您的流的迭代顺序将与数据结构中Iterator的顺序相同。

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