2012-04-11 2 views
5

부정적/긍정적 인 유지, int로 긴 변환 java.util.ComparatorLong와 :내가 구현하고자/0

new Comparator<Long>() { 
    public int compare(Long l1, Long l2) { 
     // (*) 
    } 
} 

나는 운영자 ?:있는 솔루션이 있습니다

return l1==l2 ? 0 : (l1>l2 ? 1 : -1); 

을하지만 궁금가 그것을 구현하는 다른 방법입니다.

(나는 return (int)(l1-l2)을 시도했지만 올바르지 않습니다.)

+1

왜 구현을 변경 하시겠습니까? 맞습니다. – dtech

+1

'return (int) Math.signum (l1-l2)'? – assylias

+0

@assylias 그러면 long을 double로 변환하고 double을 int로 다시 변환합니다. 또한 그 해결책은 모든 장기간에 대해 올바르지 않을 수도 있습니다 (예 : 0을 2^60 및 2^60-1로 반환) – dtech

답변

12

Long 자체 구현을 제공합니다 ... 그 시점에서 나는 당신이 모든 사용자 지정 비교기를 가지고 왜 확실하지 않다, 다른 한편으로

public int compare(Long l1, Long l2) { 
    return l1.compareTo(l2); 
} 

편집 : 실제로long 값을 비교하고 Java 1.7 사용하는 경우 Long.compare(long, long) 사용할 수 있습니다. 그렇지 않으면 현재 구현으로 이동하십시오.

+0

감사합니다. 내 실제 문제에 대한 간략한 데모입니다. 그러나 나는 방금 비교할 필요가있는 것이'long's가 아니라'Long's가 아니라는 것을 알았습니다. 그래서 여전히'? :'를 사용해야합니다. – Freewind

+0

@FreeWind Java는 1.6 이후 autoboxing을 가지고있어서 중요하지 않습니다. long 및 Long은 메서드 시그니처에서 상호 교환하여 사용할 수 있습니다. 아니면 그냥 새로운 long (long 값)을 사용할 수 있습니다. – dtech

+0

@Freewind : 편집하기 전에 그렇게 말했 으면 좋겠습니다. –

2

아니요, 그렇게하는 유일한 방법입니다. 이 주제는 이미 많은 시간에 논의되었습니다. 물론 java.lang.Long은 이미 compareTo 함수를 구현하고 있지만 구현 된 것과 완전히 똑같습니다. - 쉽게

+0

마지막으로 나는 여전히'? :'를 사용하지만,이 질문에서는'Long'이므로 JonSkeet의 대답을 선택해야합니다. 고맙습니다! – Freewind