我正在写一个有董事会的游戏:
________
|__|__|__|
|__|__|__|
|__|__|__|
我想将每列中的项目与顶部分开:
________
|__|__|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 抽象
答案 0 :(得分:2)
这不是特定于Java 8的,但听起来你会受益于Guava's Table
;值得注意的是,ArrayTable
。
它为您提供了一个更方便的API来添加和检索特定坐标处的内容,并且由于您在获得对象时知道了世界的大小,因此您不必担心空间或创建一堆尴尬的物品将一切都捆绑在一起。
答案 1 :(得分:1)
有许多事情需要考虑:
流API合规性
Stream
接口,则必须直接实现它或提供返回Stream
实例的转换方法(更好的方法)。内部实施
Collection
实例并让Collection
来处理转换进入Stream
。迭代顺序
如果迭代次序的假设是正确的,那么最简单的方法是在内部使用ArrayList<T>
并始终将矩阵中的坐标重新计算到ArrayList
索引中。您的流的迭代顺序将与数据结构中Iterator
的顺序相同。
interface MyType<T> {
void pushtoTop(int, T);
void pushToBottom(int, T);
Stream stream();
}