科特林计算与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。 IntDouble等仅扩展NumberComparable ,两者都不定义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()