Der Code für diesen Artikel ist in ** JDK 1.8 ** geschrieben.
Wenn Sie Objekte Ihrer eigenen Klasse vergleichen, müssen Sie eine Vergleichslogik definieren, die sie groß und klein macht. Es gibt die folgenden zwei Definitionsmethoden.
Es kann mit beiden Methoden definiert werden, aber es gibt eine Richtlinie, für die eine definiert werden muss, daher werde ich sie erläutern.
Vergleichen Sie die Klasse "Buch" mit den Informationen im Buch.
public class Book {
//Titel
private String title;
//Preis
private int price;
//Ausgabedatum
private LocalDate dateOfIssue;
}
Implementieren Sie die "Comparable" -Schnittstelle von "java.lang" und überschreiben Sie die "compareTo" -Methode, um die Vergleichslogik zu definieren. Wenn Sie beispielsweise mit "title" vergleichen möchten, implementieren Sie Folgendes.
public class Book implements Comparable<Book>{
//Titel
private String title;
//Preis
private int price;
//Ausgabedatum
private LocalDate dateOfIssue;
@Override
public int compareTo(Book book){
return title.compareTo(book.title);
}
}
Das Vergleichsergebnis von "title" wird so wie es ist zurückgegeben. Durch Sortieren der Liste der "Buch" -Objekte werden diese in aufsteigender Reihenfolge des "Titels" sortiert.
** Sortierbeispiel **
Book book1 = new Book();
book1.setTitle("Doraemon");
book1.setPrice(500);
book1.setDateOfIssue(LocalDate.of(2010,10,10));
Book book2 = new Book();
book2.setTitle("Perman");
book2.setPrice(400);
book2.setDateOfIssue(LocalDate.of(2012,10,10));
Book book3 = new Book();
book3.setTitle("Oba Q.");
book3.setPrice(300);
book3.setDateOfIssue(LocalDate.of(2014,10,10));
List<Book> bookList = Arrays.asList(book1, book2, book3);
System.out.println("Vor dem Sortieren:" + bookList);
Collections.sort(bookList);
System.out.println("Nach dem Sortieren:" + bookList);
sort (List <T> list)
von java.util.Collections
vergleicht und sortiert die Elemente gemäß dem compareTo
des Objekts des Elements.
** Ausführungsergebnis **
Vor dem Sortieren:[Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10), Book(title=Oba Q., price=300, dateOfIssue=2014-10-10)]
Nach dem Sortieren:[Book(title=Oba Q., price=300, dateOfIssue=2014-10-10), Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10)]
Beachten Sie, dass compareTo
nur ** eine Vergleichslogik ** definieren kann.
Erstellen Sie eine Klasse, die den Comparator
von java.util
implementiert, und überschreiben Sie die compare
-Methode, um die Vergleichslogik zu definieren. Wenn Sie beispielsweise mit "title" vergleichen möchten, implementieren Sie Folgendes.
public class BookTitleComparator implements Comparator<Book> {
@Override
public int compare(Book book1, Book book2){
return book1.getTitle().compareTo(book2.getTitle());
}
}
Verwenden wir dies zum Sortieren.
** Sortierbeispiel **
Book book1 = new Book();
book1.setTitle("Doraemon");
book1.setPrice(500);
book1.setDateOfIssue(LocalDate.of(2010,10,10));
Book book2 = new Book();
book2.setTitle("Perman");
book2.setPrice(400);
book2.setDateOfIssue(LocalDate.of(2012,10,10));
Book book3 = new Book();
book3.setTitle("Oba Q.");
book3.setPrice(300);
book3.setDateOfIssue(LocalDate.of(2014,10,10));
List<Book> bookList = Arrays.asList(book1, book2, book3);
System.out.println("Vor dem Sortieren:" + bookList);
bookList.sort(new BookTitleComparator());
System.out.println("Nach dem Sortieren:" + bookList);
** Ausführungsergebnis **
Vor dem Sortieren:[Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10), Book(title=Oba Q., price=300, dateOfIssue=2014-10-10)]
Nach dem Sortieren:[Book(title=Oba Q., price=300, dateOfIssue=2014-10-10), Book(title=Doraemon, price=500, dateOfIssue=2010-10-10), Book(title=Perman, price=400, dateOfIssue=2012-10-10)]
Sie können eine beliebige Anzahl von Klassen erstellen, die "Comparator" gemäß der unten gezeigten Vergleichslogik ** implementieren.
** Preisvergleich Komparator
**
public class BookPriceComparator implements Comparator<Book> {
@Override
public int compare(Book book1, Book book2){
return Integer.valueOf(book1.getPrice()).compareTo(book2.getPrice());
}
}
** Ausgabedatum Vergleich Komparator
**
public class BookDateOfIssueComparator implements Comparator<Book> {
@Override
public int compare(Book book1, Book book2){
return book1.getDateOfIssue().compareTo(book2.getDateOfIssue());
}
}
Wenn Sie die statische Methode "Vergleichen" von "Komparator" verwenden, müssen Sie nicht einmal eine Klasse erstellen.
//Titelreihenfolge
bookList.sort(Comparator.comparing(Book::getTitle));
//Nach Preis
bookList.sort(Comparator.comparing(Book::getPrice));
//Nach Ausstellungsdatum
bookList.sort(Comparator.comparing(Book::getDateOfIssue));
Aus der Schlussfolgerung denke ich, dass es ** grundsätzlich besser ist, Comparator
** zu verwenden.
Da Comparable
nur ein compareTo
definieren kann, das zu einer Klasse gehört, sollten Sie die Vergleichslogik implementieren, die für diese Klasse am natürlichsten erscheint. Zum Beispiel scheint "LocalDate" ein natürlicher Vergleich zwischen Datumsangaben zu sein, daher wird "compareTo" in der Logik "vorheriges Datum <nach Datum" implementiert.
In welchem Bereich ist es also natürlich, in diesem "Buch" zu vergleichen? Ist es irgendwie ein Titel? Es scheint, dass der Vergleich nach Veröffentlichungsdatum je nach Person natürlich sein kann, und wenn in Zukunft ein Feld wie "bookId" hinzugefügt wird, wird es noch verschwommener, oder? Ich habe nur das Gefühl eines Fehlers.
Comparator
kann ** klar angeben, was der Vergleich mit dem Klassennamen ** ist, so dass Sie solche Unschärfen verhindern können. Wenn Sie einen komplexen Vergleich durchführen möchten, z. B. einen Vergleich nach Veröffentlichungsdatum, wenn die Titel identisch sind, können Sie eine separate Implementierungsklasse "Comparator" hinzufügen.
Comparator
kann den Inhalt der Vergleichslogik durch den zu implementierenden Klassennamen angeben.Comparable
kann nur eine Vergleichslogik implementiert werden, in Comparator
jedoch so viele, wie die Anzahl der Klassen implementiert werden kann.Comparator
implementieren![Einführung in Java - Von Grundlagen im modernen Stil zu objektorientierten und praktischen Bibliotheken](https://www.amazon.co.jp/Java%E6%9C%AC%E6%A0%BC%E5%85%A5%] E9% 96% 80-% EF% BD% 9E% E3% 83% A2% E3% 83% 80% E3% 83% B3% E3% 82% B9% E3% 82% BF% E3% 82% A4% E3 % 83% AB% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E5% 9F% BA% E7% A4% 8E% E3% 81% 8B% E3% 82% 89% E3% 82 % AA% E3% 83% 96% E3% 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 83% BB % E5% AE% 9F% E7% 94% A8% E3% 83% A9% E3% 82% A4% E3% 83% 96% E3% 83% A9% E3% 83% AA% E3% 81% BE% E3 % 81% A7-% E8% B0% B7% E6% 9C% AC-% E5% BF% 83-ebook / dp / B071D8RYR5) Comparable (Java Platform SE 8 ) Comparator (Java Platform SE 8 )
Recommended Posts