我正在尝试编写一种返回值列表中最接近的值的算法。因此,在List(4.0,6.0,2.0)中,最接近7.0的值是6.0
以下是我正在使用的代码,但由于返回的最接近值为4,因此它是不正确的:
如何解决下面的代码,或者有一种我可以用来解决此问题的Scala实用工具方法?
val num = 7.0 //> num : Double = 7.0
val listNums = List[Double](4,6,2) //> listNums : List[Double] = List(4.0, 6.0, 2.0)
def getClosest(num : Double , listNums : List[Double]) = {
var min = java.lang.Double.MAX_VALUE
var closest = num
for(x <- listNums ){
val diff = x - num
if(num < min){
min = diff
closest = x
}
}
closest
} //> getClosest: (num: Double, listNums: List[Double])Double
val closest = getClosest(num , listNums) //> closest : Double = 4.0
这几乎与minBy
以下情况一模一样:
def getClosest(num: Double, listNums: List[Double]) =
listNums.minBy(v => math.abs(v - num))
minBy
不幸的是,它是一个部分函数-在空列表上调用时,它将崩溃并发生异常。为了匹配实现的行为,可以编写以下代码:
def getClosest(num: Double, listNums: List[Double]) = listNums match {
case Nil => Double.MaxValue
case list => list.minBy(v => math.abs(v - num))
}
代码的问题在于,您没有采用绝对值,因为另一个答案是隐式指出的。不过请不要使用Math.abs
-这是的简写java.lang.Math.abs
。math.abs
更习惯。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句