通过Java流计算2D数组中的邻居

时间:2019-01-29 13:26:14

标签: java java-8 java-stream

我有一个二维数组,像这样:

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();
            }
        }
    }

2 个答案:

答案 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();}
}
}

如果这不是您想要的,请您更具体吗?希望这会有所帮助!