2012-04-11 26 views
5

Tôi muốn thực hiện một java.util.Comparator với Long:Chuyển đổi dài để int, giữ tích cực/tiêu cực/0

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

tôi có một giải pháp với nhà điều hành ?::

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

Nhưng tôi tự hỏi, nếu có là cách nào khác để thực hiện nó.

(Tôi đã thử return (int)(l1-l2), nhưng không chính xác).

+1

Tại sao bạn muốn thay đổi triển khai của mình? Đung vậy. – dtech

+1

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

+0

@assylias Bạn sau đó chuyển đổi một dài thành một đôi, và một đôi trở lại một int một lần nữa. Ngoài ra giải pháp đó có thể không chính xác cho tất cả các dài (ví dụ trở về 0 trên 2^60 và 2^60-1) – dtech

Trả lời

12

Đó là dễ dàng - Long tự cung cấp một thực hiện:

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

Mặt khác, tại thời điểm đó tôi không chắc chắn lý do tại sao bạn đã có một so sánh tùy chỉnh ở tất cả ...

CHỈNH SỬA: Nếu bạn đang thực hiện thực sự so sánh long giá trị và bạn đang sử dụng Java 1.7, bạn có thể sử dụng Long.compare(long, long). Nếu không, hãy đi với việc triển khai hiện tại của bạn.

+0

Cảm ơn bạn, đó là một bản demo đơn giản về vấn đề thực sự của tôi. Nhưng tôi chỉ tìm thấy, những gì tôi cần so sánh là 'long', không phải 'Long', vì vậy tôi vẫn phải sử dụng '?:' – Freewind

+0

@FreeWind Java có autoboxing kể từ 1.6 nên nó không quan trọng. long và Long có thể được sử dụng thay thế lẫn nhau trong các chữ ký phương thức. Hoặc bạn chỉ có thể sử dụng 'mới Long (giá trị dài)' – dtech

+0

@Freewind: Tôi muốn bạn đã nói như vậy trước khi ... chỉnh sửa ... –

2

Không, đó là cách hợp lệ duy nhất để thực hiện việc này. Chủ đề này đã được thảo luận rất nhiều lần. Tất nhiên, java.lang.Long thực hiện đã là một hàm compareTo, nhưng nó đã thực hiện chính xác giống như bạn có.

+0

Cuối cùng tôi vẫn sử dụng '?:', Nhưng vì câu hỏi này là 'Long', nên tôi phải chọn câu trả lời của JonSkeet. Cảm ơn bạn! – Freewind

Các vấn đề liên quan