2012-04-11 4 views
5

ich ein java.util.Comparator mit Long implementieren möchten:konvertieren lange in int, halten positiv/negativ/0

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

Ich habe mit Operator eine Lösung ?::

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

Aber ich frage mich, ob es ist eine andere Möglichkeit, es zu implementieren.

(Ich versuchte return (int)(l1-l2), aber es ist falsch).

+1

Warum möchten Sie Ihre Implementierung ändern? Das ist richtig. – dtech

+1

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

+0

@assylias Sie konvertieren dann ein Long zu einem Double und ein Double zurück zu einem Int. Auch diese Lösung ist möglicherweise nicht für alle Longs korrekt (z. B. Rückgabe 0 auf 2^60 und 2^60-1) – dtech

Antwort

12

das einfach - Long selbst stellt eine Implementierung:

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

Auf der anderen Seite, an diesem Punkt bin ich nicht sicher, warum Sie überhaupt einen benutzerdefinierten Komparator haben ...

EDIT: Wenn Sie tatsächlichlong Werte vergleichen und Sie Java 1.7 verwenden, können Sie Long.compare(long, long) verwenden. Ansonsten geh mit deiner aktuellen Implementierung.

+0

Danke, es ist eine vereinfachte Demo meines wirklichen Problems. Aber ich habe gerade gefunden, was ich vergleichen muss, ist 'lang's, nicht'Lang's, also muss ich' '' immer noch verwenden? '' – Freewind

+0

@FreeWind Java hat seit 1.6 Autoboxing, also spielt es keine Rolle. long und Long können in Methodensignaturen vertauscht werden. Oder du kannst einfach 'new Long (long value)' – dtech

+0

@Freewind verwenden: Ich wünschte, du hättest das schon gesagt ... editieren ... –

2

Nein, das ist der einzig gültige Weg. Dieses Thema wird bereits oft diskutiert. Natürlich implementiert java.lang.Long bereits eine compareTo-Funktion, aber es hat genau die gleiche Implementierung wie Sie.

+0

Schließlich verwende ich noch '?:', Aber da es in dieser Frage 'Long' ist, muss ich JonSkeet's Antwort wählen. Vielen Dank! – Freewind