Um die Sortierung zu implementieren, ist es erforderlich, dass die zu sortierenden Objekte mehr oder weniger miteinander verglichen werden können. Mit anderen Worten, um eine Regel zu definieren, nach der zwei beliebige Objekte angeben können, welche von ihnen im angegebenen Kontext früher und welche später kommen.
In Java werden diese Regeln auf der Ebene der Klassen definiert, zu denen die Objekte gehören. Nehmen wir zum Beispiel eine Klasse zur Beschreibung des Benutzerkontos:
UserAccount {
currency
value
updatedTimestamp
}Je nach Kontext können Benutzerkonten nach verschiedenen Regeln verglichen werden, zum Beispiel:
In der Anwendung sieht der Benutzer Konten, die nach Währung und dann nach Wert sortiert sind.
Im Admin-Bereich werden alle Benutzerkonten nach Änderungsdatum sortiert.
Um einen Vergleich für mehr oder weniger in Java zu implementieren, gibt es zwei Möglichkeiten:
UserAccount implementiert die Schnittstelle
Comparable<UserAccount>In diesem Fall können zwei Objekte miteinander verglichen werden:acc1.compareTo(acc2)Es wird eine separate Klasse erstellt, die die Schnittstelle implementiert.
Comparator<UserAccount>Anschließend kann das Objekt dieser Klasse zwei Objekte der ursprünglichen Klasse miteinander vergleichen:userAccountComparator.compare(acc1, acc2)
Offensichtlich gibt es in einigen Fällen keine Wahl zwischen Vergleichbar und Vergleicher. Wenn die ursprüngliche Klasse nicht geändert werden kann oder andere Vergleichsregeln erforderlich sind, muss ein Komparator verwendet werden. Andernfalls können Sie sowohl Comparator als auch Comparable technisch verwenden.
Comparable , (class's natural ordering). , (String, Date). , . , . ( BigDecimal , 4.0 4.00?). , "" . Comparable.
. , . . : . :
:
Arrays.sort(accountsList):
Arrays.sort(accountsList, accountByValueComparator)
, compareTo UserAccount, - accountByValueComparator. . .
UserAccount implements Comparable<UserAccount> {
@Override
public int compareTo(UserAccount other) { .. }
} , compareTo ? , Comparable#compareTo, Arrays.sort(). jdk, . : UserAccount Arrays.sort(), stream.sorted() .
Bei einer expliziten Übertragung eines Komparators ist es elementar, seine Verwendung zu finden. Ich nehme dies als Argument für die Verwendung eines Komparators. (Equals / hashCode ist ein weiteres Beispiel für die Schwierigkeit, implizite Verwendungen zu finden, aber es gibt keine "Equalator" -Alternative für sie).
Zusammenfassend überwiegen in den meisten Fällen die Argumente für die Verwendung von Comparator die Argumente für die Verwendung von Comparable.