Java int[][]中的IntStream有问题,我不知道';我不知道allMatch()在做什么

Java int[][]中的IntStream有问题,我不知道';我不知道allMatch()在做什么,java,Java,成名后,他们决定一起搬进新楼。每个房间都有不同的费用,其中一些是免费的,但有传言说所有免费房间都闹鬼了!由于代码机器人相当迷信,他们拒绝呆在任何免费房间,或任何免费房间下面的任何房间 给定一个矩阵,一个整数的矩形矩阵,其中每个值表示房间的成本,您的任务是返回适合CodeBot的所有房间的总和(即:将所有不低于0的值相加) 例如: 用于: 输出应该是 matrixElementsSum(matrix) = 9 有人能解释一下allMatch在这段代码中是如何工作的吗? int matrixEle

成名后,他们决定一起搬进新楼。每个房间都有不同的费用,其中一些是免费的,但有传言说所有免费房间都闹鬼了!由于代码机器人相当迷信,他们拒绝呆在任何免费房间,或任何免费房间下面的任何房间

给定一个矩阵,一个整数的矩形矩阵,其中每个值表示房间的成本,您的任务是返回适合CodeBot的所有房间的总和(即:将所有不低于0的值相加)

例如: 用于:

输出应该是

matrixElementsSum(matrix) = 9
有人能解释一下
allMatch
在这段代码中是如何工作的吗?

int matrixElementsSum(int[][] matrix) {
        return IntStream.range(0, matrix.length)
                .map(i -> IntStream.range(0, matrix[0].length)
                        .map(j -> IntStream.range(0, i)
                                .allMatch(k -> matrix[k][j] > 0)
                                ? matrix[i][j] : 0)
                        .sum())
                .sum();
}
这是矩阵,程序遍历矩阵中的每个元素(即矩阵[i,j]),
i
表示当前行,
j
表示当前列,该语句决定是否将元素添加到sum中:

IntStream.range(0,i).allMatch(k->matrix[k][j]>0)

该语句表示到当前元素的所有元素“最多”都应该匹配
>0
,这表示不自由。

allMatch()
方法采用
IntPredicate
对象
IntPredicate
是一个“函数方法”为
test(int)
的谓词。代码将所有元素传递给它,并检查它们是否都匹配。您也可以在这里使用
anyMatch()
方法。那么您的代码将如下所示:

int matrixElementsSum(int[][] matrix) {
    return IntStream.range(0, matrix.length)
            .map(i -> IntStream.range(0, matrix[0].length)
                    .map(j -> IntStream.range(0, i)
                            .anyMatch(k -> matrix[k][j] == 0)
                            ? 0 : matrix[i][j] )
                    .sum())
            .sum();
}

此外,该算法的时间复杂度是
f(i,j)=j.(i(i+1)/2)=O(j.i^2)
,其中
i
是行数,
j
是列数。

java也有可用的文档。我可以看到矩阵访问的数量是11,而对于任何一种方法,都应该是8。对于初学者来说,指出时间复杂度太高可能是个好主意。我真诚地希望这是机器人学到的下一课。哦,亲爱的,它当然会覆盖整个x,y。是的,非常感谢!
matrix = [[0, 1, 1, 2], 
          [0, 5, 0, 0], 
          [2, 0, 3, 3]]
int matrixElementsSum(int[][] matrix) {
    return IntStream.range(0, matrix.length)
            .map(i -> IntStream.range(0, matrix[0].length)
                    .map(j -> IntStream.range(0, i)
                            .anyMatch(k -> matrix[k][j] == 0)
                            ? 0 : matrix[i][j] )
                    .sum())
            .sum();
}