我应该使用什么二维数据结构来支持 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 抽象。
有很多事情需要考虑:
流API合规性
- 如果你想使用
Stream
接口,你要么直接实现它,要么提供一个return一个Stream
实例的转换方法(更好的方法)。
内部实现
- 在您考虑以最简单的方式理想地支持流之前,内部实现并不是那么重要,这就是以某种方式将您的数据结构表达为
Collection
实例并让 Collection
来处理转换为 Stream
.
迭代顺序
- 这不是很明显,但迭代顺序可能决定了内部数据结构格式。最简单的方法是从上到下遍历行。
如果 迭代顺序 的假设是正确的,那么最简单的方法是在内部使用 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 或创建一堆笨拙的对象来绑定所有内容。
我正在编写一个有棋盘的游戏:
________
|__|__|__|
|__|__|__|
|__|__|__|
我想从顶部分别推送每列中的项目:
________
|__|__|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 抽象。
有很多事情需要考虑:
流API合规性
- 如果你想使用
Stream
接口,你要么直接实现它,要么提供一个return一个Stream
实例的转换方法(更好的方法)。
- 如果你想使用
内部实现
- 在您考虑以最简单的方式理想地支持流之前,内部实现并不是那么重要,这就是以某种方式将您的数据结构表达为
Collection
实例并让Collection
来处理转换为Stream
.
- 在您考虑以最简单的方式理想地支持流之前,内部实现并不是那么重要,这就是以某种方式将您的数据结构表达为
迭代顺序
- 这不是很明显,但迭代顺序可能决定了内部数据结构格式。最简单的方法是从上到下遍历行。
如果 迭代顺序 的假设是正确的,那么最简单的方法是在内部使用 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 或创建一堆笨拙的对象来绑定所有内容。