2017-12-17 11 views
0

제공되는 표준 편차를 계산하는 방법을 쓰고 싶습니다. 여기Kotlin은 generics로 표준 편차를 계산합니다.

은 그것과 같은 모습입니다 : 그러나

fun calculateSD(numArray: List<Int>): 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) 
} 

, 난, 플로트 이것은 또한 이중의 목록을 위해 일하려는 등

그래서 제네릭 사용해야합니다

fun <T>calculateSD(numArray: List<T>): 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 오류가 발생합니다.

어떻게 작동시킬 수 있습니까?

답변

3

상상할 수있는 방식으로 다른 숫자 유형에 대한 제네릭을 작성하는 좋은 방법은 없습니다. Int, Double 등은 NumberComparable을 확장하며 어느 쪽도 operator plus을 정의하지 않습니다.

그러나, 특정 사용하는 경우에, 당신은 당신의 누적 변수는 항상 Double 사실을 이용할 수있다 :

fun <T : Number> calculateSD(numArray: List<T>): 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() 
+0

안녕하세요, 귀하의 답변에 감사드립니다. 그러나, 나는 내 방식에 버그가있다. 어쩌면 당신을 도울 수 있습니까? 나는 내 질문을 업데이트했습니다 – Konrad

+0

@okset : 재생산 할 수 없습니다 : https://ideone.com/F9YR0c –

+0

확인해 주셔서 감사합니다. 업데이트 된 질문 (업데이트 2) – Konrad