2014-11-12 1 views
1

비교하려고하는 객체 (Word)가 int으로 정의 된 두 개의 속성을 가지고 있으므로 비교기를 구현하려고합니다.표준 편차는 전이 적이 지 않습니다?

이 두 값의 표준 편차를 얻고 싶습니다. (더 많을 수도 있지만 2 일 수도 있습니다.) 개체가 가장 낮은 값을 갖는 목록을 정렬합니다. 하지만 분명히, 내 방법은 this question을 기반으로 한 전 이적이지 않다는 것을 말하고 있습니다 (저는 동일한 예외가 있기 때문에 생각합니다). 하지만 표준 편차의 결과를 비교하는 방법은 여기에서 볼 수 없습니다.

나는 수학과 혼동하고이 방법이 과도 적이 지 않거나 잘못된 것을 지적한 특별한 경우를 고려하지 않았습니다.

for(Map.Entry<String,List<Word>> entry: list.entrySet()){ 
Collections.sort(entry.getValue(), Collections.reverseOrder(new SimpleComparator())); 
... 
} 

비교기 클래스 :

목록 정렬

import java.util.Comparator; 

public class SimpleComparator implements Comparator<Word> { 
    @Override 
    public int compare(Word word1, Word word2) { 
     int b1,b2,f1,f2; 
     double average1,average2, result1,result2; 
     b1 = word1.getAttr1(); 
     b2 = word2.getAttr1(); 
     f1 = word1.getAttr2(); 
     f2 = word2.getAttr2(); 
     average1 = (b1-f1)/2; 
     average2 = (b2-f2)/2; 
     result1 = Math.sqrt((Math.pow(b1-average1,2)+Math.pow(f1-average1,2))/2); 
     result2 = Math.sqrt((Math.pow(b2-average2,2)+Math.pow(f2-average2,2))/2); 
     return (int)(result1 - result2); 
    } 
} 
+0

가 해당 비교기 equals와 일관성하여 메소드 이의 예이다. 나는 당신이 (예를 들어)? :를 사용하여 결과로 -1, 0, 1을 얻고 싶다고 생각한다. –

답변

3

당신은 Math.signum(result1 - result2)를 사용해야 생산하는 -1 결과는 결과가있는 경우 0, 음수 인 경우 결과가 양수이면 1입니다. 결과를 double로 유지하십시오. int를 double 형으로 캐스팅 할 때 발생하는 잘림은 부정확 한 결과를 산출합니다.

대신하여 return 문을 대체 :이 경우

return (int) Math.signum(result1 - result2); 

, 0.9 - 0.3의 결과가 0.6 것,의 부호 요소는 1 될 것이다. 그러나 double 0.6을 int로 캐스팅하면 결과는 이 아니라 0이 아니며 동일 함을 나타냅니다. 그러나 우리는 이것이 사실이 아니라는 것을 알고 있습니다. 그 이유는 숫자 데이터 유형을 더 낮은 정밀도로 캐스팅 할 때 값이 반올림되지 않기 때문에 정밀도가 떨어지므로 소수점 이후의 값이 떨어져 버리는 것입니다.

는 구현은 모든 x와 y에 대한 그 SGN (비교 (X, Y)) == -sgn (x)의 비교 (Y를) 확인해야합니다 Comparator.comare(T, T)

의 JavaDoc을 참조하십시오.

+0

그래, 어쩌면 못생긴 주조가 문제라고 생각했는데'Math.signum (a, b) '에 대해서는 몰랐다.그러나 만약 내가 double을 유지해야한다면, 어떻게 비교 메소드를 재정의 할 것인가? –

+0

그래서 Double로 머물려고 노력하면서'return Double.compare (result1, result2); '를 사용하면 괜찮을까요? –

+1

두 배를 반환 할 필요는 없지만 차이를 계산할 때 결과 배정의 정밀도를 유지하면됩니다. 내가 명확하게 대답을 업데이 트됩니다. –

0

compare(x1,x2) 방법 조건 위반 :

해당 비교 확인해야 구현이 (X는, Y) == 0 SGN가 == SGN을 ((X, Z))와 비교하는 것이 의미를 (비교 (y, z))를 계산한다. 여기

인해 라운딩 compare(w1,w2)=0

public static void main(String[] args) { 

Word w1=new Word(2,5); 
Word w2=new Word(1,5); 
Word w3=new Word(2,4); 

    System.out.println(Math.signum(getStandardDeviation(w1, w3))==Math.signum(getStandardDeviation(w2, w3))); 
} 

public static double getStandardDeviation(Word word1,Word word2) 
{ 
    int b1,b2,f1,f2; 
    double average1,average2, result1,result2; 
    b1 = word1.getAttr1(); 
    b2 = word2.getAttr1(); 
    f1 = word1.getAttr2(); 
    f2 = word2.getAttr2(); 
    average1 = (b1-f1)/2; 
    average2 = (b2-f2)/2; 
    result1 = Math.sqrt((Math.pow(b1-average1,2)+Math.pow(f1-average1,2))/2); 
    result2 = Math.sqrt((Math.pow(b2-average2,2)+Math.pow(f2-average2,2))/2); 
    return (int)(result1 - result2); 
} 

}

관련 문제