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