繁体   English   中英

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

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

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

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

我想从顶部分别推入​​各列中的项目:

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

和/或从底部开始:

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

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

        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循环来处理我的开发board

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

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

它不是特定于Java 8的,但是听起来您将从Guava的Table受益; 值得注意的是ArrayTable

它为您提供了一个更方便的API,用于在特定坐标处添加和检索事物,并且由于您知道在获取对象时世界的大小,因此您不必担心太多空间或创建一堆笨拙的东西。对象以捆绑一切。

有很多事情要考虑:

  1. 流API合规性

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

    • 除非您考虑以最简单的方式理想地支持流,否则内部实现并不重要,这将以某种方式将您的数据结构表示为Collection实例,并让Collection负责转换为Stream
  3. 迭代顺序

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

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

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

    Stream stream();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM