我有一个二维数组,像这样:
0,1,1,1,0
0,1,0,1,1
1,0,1,0,1
1,1,1,0,0
0,0,1,0,0
我想计算数字为1时相邻单元格的总和。
例如对于i = 1,j = 1,总和为4。
用循环计数不是问题,但是可以用java流计数(当然也可以用ArrayList代替tab [] [])?
private void countAlive(Cell[][] cell) {
for (int i = 0; i < cell.length; i++) {
for (int j = 0; j < cell[0].length; j++) {
cell[i][j].setAlive(0);
if (cell[i - 1][j - 1].cellAlive())
cell[i][j].increaseAlive();
if (cell[i - 1][j].cellAlive())
cell[i][j].increaseAlive();
if (cell[i - 1][j + 1].cellAlive())
cell[i][j].increaseAlive();
if (cell[i][j - 1].cellAlive())
cell[i][j].increaseAlive();
if (cell[i][j + 1].cellAlive())
cell[i][j].increaseAlive();
if (cell[i + 1][j - 1].cellAlive())
cell[i][j].increaseAlive();
if (cell[i + 1][j].cellAlive())
cell[i][j].increaseAlive();
if (cell[i + 1][j + 1].cellAlive())
cell[i][j].increaseAlive();
}
}
}
答案 0 :(得分:1)
流非常适合抽象迭代的完成方式,并专注于要在对象上/与对象一起执行的实际过程。但是,这在迭代顺序无关紧要时很有用。在这种情况下,它会:不是顺序本身,而是对象在每个步骤的索引,本质上是与2D数组其他对象相比的相对位置。当您流处理该数组Cell [] []时,您一次获得一个Cell对象,没有其索引。
Arrays(array2DofCells).stream().flatMap(x ->Arrays.stream(x))
.forEach( cell -> { //What would you do here without the indexes? } )
一种方法是让每个Cell知道其索引,以便您可以调用cell.getRowIndex()
和cell.getColumnIndex()
并在父2D数组上执行要执行的过程。
但是,正如评论中指出的那样,除非有非常特殊的原因,否则这似乎是避免流的情况。这样做的指针是,您开始怀疑在.forEach()范围内如何获取流有意隐藏的信息。
答案 1 :(得分:0)
我认为您可能正在寻找类似的东西:
var cells = [
"01110",
"01011",
"10101",
"11100",
"00100",
];
for (var i = 0; i < cells.length; i++) {
for (var j = 0; j < cells[i].length; j++) {
if (cells[i][j - 1] == "1") {cellAlive();}
if (cells[i][j + 1] == "1") {cellAlive();}
if (cells[i - 1][j] == "1") {cellAlive();}
if (cells[i + 1][j] == "1") {cellAlive();}
}
}
如果这不是您想要的,请您更具体吗?希望这会有所帮助!