我正在使用Java 8流进行培训,尝试实现与此Scala代码相同的逻辑,我也写道:
def solution = {
var s = "input"
var n = Math.sqrt(s.length / 3).toInt
val arr = s.split("\\s+").map(_.toInt)
def prod(index : Int, count : Int = 4)(inc : Int) : Int =
if (count > 0) arr(index)*prod(index + inc,count - 1)(inc) else 1
def prodInRange(rows : Seq[Int], cols : Seq[Int])(inc : Int) =
for (i <- rows ; j <- cols) yield prod(n*i + j)(inc)
val seq = prodInRange(0 to 19,0 to 16)( 1 ) ++ prodInRange(0 to 16,0 to 19)( n ) ++
prodInRange(0 to 16,0 to 16)(n + 1) ++ prodInRange(3 to 19,0 to 16)(1 - n)
seq.max
}
我在Java中实现了prod
,没有什么特别之处,方法解决方案也完全相同。但是,我在prodInRange
遇到了困难。我将其更改为maxProdInRange
,它不仅应计算所有产品,还应计算其最大值。这是代码:
public static int maxProdInRange(IntStream rows, IntStream cols, int inc, List<Integer> input) {
int n = (int) Math.sqrt(input.size());
return rows.flatMap(i -> cols.map(j -> prod(i*n + j,inc,input))).max().getAsInt();
}
尽管如此,我在调用maxProdInRange时遇到异常(见标题)。根据我试图调试它的测试,它只在我调用max()时才会出现。首先,我想知道为什么我会收到这个错误(我认为它来自对Java流的误解)以及解决它的方法。
请注意,在maxProdInRange
的所有调用中都有maxProdInRange(IntStream.range(a,b),IntStream.range(a,b),input)
格式,因此当作为参数传递时,行和列都不会被操作。