我是Scala的新手,正在开展一个项目。我正在编写一个函数,假设返回数组中最小的Int
。但是,当我运行它时,我得到一个类型错误,它返回单位而不是int。
这是我的代码:
def minWhile(r: Array[Int]): Int = {
var pos = 1
var minInt = r(0)
while (pos < r.length) {
if (r(pos) < minInt)
minInt = r(pos)
pos += 1
}
minInt
}
非常感谢!
答案 0 :(得分:3)
您的代码编译正确,因为它始终返回正确的Int类型。但是如果我们将空数组传递给你的函数,它可能会导致一些运行时异常:minWhile(Array())。
def minWhile(r: Array[Int]): Int =
{
var pos = 1
var minInt = r(0) /* potential runtime exception */
while( pos < r.length){
if(r(pos) < minInt)
minInt = r(pos)
pos+=1
}
minInt
}
您必须检查使用它的数组边界。 或者您可以使用更短的方式:
def minWhile(r: Array[Int]): Option[Int] = if (r.nonEmpty) Some(r.min) else None
答案 1 :(得分:1)
您的代码应该正确编译,但在传递空容器时可能会出现异常。您正在使用不鼓励的变量。
我会使用一些递归调用或scala集合API,如下所示:
array.reduceLeft(a: Somehitng, b: Something => Something)
检查thia链接:
http://m.alvinalexander.com/scala/scala-use-reduceleft-get-max-min-from-collection
答案 2 :(得分:0)
考虑这种传达minWhile
语义的更具功能性的风格,如下所示,
def minWhile(r: Array[Int]): Int = {
(r zip r.drop(1)).takeWhile(t => t._1 > t._2).last._2
}
我们压缩连续项目,take
那些单调递减。期望的结果可以在最后一部分的第二部分找到。