2015-03-21 2 views
10

Wie Sie zwei Objekte in Java vergleichbar machen mit "<" oder ">" z.Vergleichen Sie zwei Objekte mit "<" or ">" -Operatoren in Java

MyObject<String> obj1= new MyObject<String>(“blablabla”, 25); 
MyObject<String> obj2= new MyObject<String>(“nannaanana”, 17); 
if (obj1 > obj2) 
    do something. 

I MyObject-Klasse-Header als

public class MyObject<T extends Comparable<T>> implements Comparable<MyObject<T>> und erstellte Methode Comp aber alle der Verstärkung bekam ich gemacht habe, ist, jetzt kann ich „Art“ auf der Liste der Objekte verwenden, aber wie kann ich vergleichen zwei Objekte direkt miteinander? Ist

if(obj1.compareTo(obj2) > 0) 
    do something 

der einzige Weg?

+0

"Ist [' compareTo'] der einzige Weg? " Ja. – Kevin

+1

Sie können die '<' or '>' Operatoren in Java nicht überladen. –

+0

In C# können Sie Operatoren wie diese überladen. –

Antwort

11

In Java kann kein Operator überladen werden. Dies bedeutet, dass Sie kein benutzerdefiniertes Verhalten für Operatoren wie +, >, <, == usw. in Ihren eigenen Klassen definieren können.

Wie Sie bereits bemerkt haben, ist die Implementierung Comparable und die Verwendung der compareTo() Methode wahrscheinlich der Weg, in diesem Fall zu gehen.

Eine weitere Option ist ein Comparator (siehe docs) zu schaffen, besonders, wenn es keinen Sinn macht, für die Klasse Comparable zu implementieren oder wenn Sie Objekte aus der gleichen Klasse auf unterschiedliche Weise zu vergleichen.

Um die Lesbarkeit des Codes zu verbessern, können Sie compareTo() zusammen mit benutzerdefinierten Methoden verwenden, die natürlicher aussehen können. Zum Beispiel:

boolean isGreaterThan(MyObject<T> that) { 
    return this.compareTo(that) > 0; 
} 

boolean isLessThan(MyObject<T> that) { 
    return this.compareTo(that) < 0; 
} 

Dann könnte man sie wie folgt verwenden:

if (obj1.isGreaterThan(obj2)) { 
    // do something 
} 
3

Mit Comparable.compareTo(T) ist die einzige Option (oder Comparator). Die Schnittstelle definiert nur diese eine Methode (während Comparatorequals hinzufügt) und vergleicht dieses Objekt mit dem angegebenen Objekt für die Reihenfolge. Außerdem erlaubt Java keine Überladung des Operators (Sie können also den für das Aufrufen dieser Methode verwendeten Operanden nicht direkt ändern oder die Schnittstelle tatsächlich ändern).

+1

Es gibt auch 'Comparator'. – Makoto

+0

@Makoto ['Comparator'] (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html) stellt zwei Methoden zur Verfügung (und erlaubt immer noch kein Überladen des Operators), aber Das ist ein fairer Punkt, da es technisch eine andere Option ist. –

+0

Ich sah es nur aus dem "anderen Option" Winkel. :) – Makoto

1

Es ist nicht der einzige Weg. Sie können auch einen Komparator implementieren. Comparator verwendet compare() Methode als gegen Comparable, die compareTo() Methode verwendet.

Der Grund, warum Sie > oder < Objekte nicht direkt vergleichen können, weil Java nicht wissen, welche Variablen, die Sie für den Vergleich verwendet werden sollen (wie es könnte mehr als eine Variable in dem Objekt vorhanden ist).

Um Objekte vergleichen zu können, müssen diese Objekte vergleichbar sein. Sie müssen Java definieren und mitteilen, wie Sie diese vergleichen möchten.

Java-Sammlung bietet eine sort Methode. Einige Schulen geben Ihnen jedoch die Aufgabe, Sie zu bitten, eigene Sortiermethoden zu schreiben, die letztendlich immer noch den compareTo() zum Vergleich verwenden.

Sie können einen Blick auf die feinen Unterschiede zwischen Comparable vs Comparator hier nehmen: What is the difference between compare() and compareTo()?


Ich denke, es auch wert ist, dass zu erwähnen, von Standard-Java-String (Objekte) in einer lexikographischen Ordnung, wenn Sie vergleicht hat die Methode compareTo() nicht überschrieben.

Verwandte Themen