科特林计算与generics的标准差
我想写一个方法来计算提供的数字的标准偏差。
这里是这样的:
fun calculateSD(numArray: List): Double { var sum = 0.0 var standardDeviation = 0.0 for (num in numArray) { sum += num } val mean = sum / numArray.size for (num in numArray) { standardDeviation += Math.pow(num - mean, 2.0) } val divider = numArray.size - 1 return Math.sqrt(standardDeviation / divider) }
但是,我想这也工作列表双,浮动等
所以它需要使用generics:
fun calculateSD(numArray: List): Double { var sum = 0.0 var standardDeviation = 0.0 for (num in numArray) { sum += num } val mean = sum / numArray.size for (num in numArray) { standardDeviation += Math.pow(num - mean, 2.0) } val divider = numArray.size - 1 return Math.sqrt(standardDeviation / divider) }
但是,当我尝试这样做,我得到和Android Studio IDE错误,这强调了“+ =”运算符和“ – ”运算符。
我怎样才能使它工作?
没有什么好的方法可以用你想象的方式来泛化不同的数字types。 Int
, Double
等仅扩展Number
和Comparable
,两者都不定义operator plus
。
然而,在你的特定用例中,你可以利用这个事实,即你的累加器variables总是为Double
:
fun calculateSD(numArray: List ): Double { // ^^^^^^ // ... code code code ... for (num in numArray) { sum += num.toDouble() // This *is* available via Number interface } // ... code code code ... }
FWIW,你可以摆脱显式循环,因此:
val sum = numArray.sumByDouble { it.toDouble() }
或者如此:
val sum = numArray .map { it.toDouble() } .sum()