Gibt an, ob Java Comparable oder Comparator verwendet werden soll

Der Code für diesen Artikel ist in ** JDK 1.8 ** geschrieben.

Einführung

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.

Klasse zu vergleichen

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;

}

Definition durch "Vergleichbar"

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.

Definition durch "Komparator"

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());
    }

}

Nachtrag

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));

Also welches benutzt du?

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.

Zusammenfassung

Referenz

[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

Gibt an, ob Java Comparable oder Comparator verwendet werden soll
[Java] Verwendung von Map
Verwendung von Java Optional
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
[Java] Gründe für die Verwendung von statischen
Verwendung von Java-Variablen
Verwendung von HttpClient (Get) von Java
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
[Verarbeitung × Java] Verwendung von Variablen
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
[Verarbeitung × Java] Verwendung von Arrays
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
[Java8] Angemessene Verwendung von Compareable und Comparator unter dem Gesichtspunkt der Mitarbeitersortierung
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Java] Verwendung der File-Klasse
Verwenden Sie TMDA, um IBM Java Javacore zu analysieren
Java Artery - Einfach zu verwendende Unit-Test-Bibliothek
Verwendung der Submit-Methode (Java Silver)
[Leicht verständliche Erklärung! ] Verwendung der Java-Instanz
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
So debuggen Sie Java 9 oder höher remote
[Verarbeitung × Java] Verwendung der Schleife
Verwendung und Definition von Java-Klassen, Importieren
[Leicht verständliche Erklärung! ] Verwendung des Java-Polymorphismus
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
[Verarbeitung × Java] Verwendung der Klasse
Verwendung der Java Scanner-Klasse (Hinweis)
[Verarbeitung × Java] Verwendung der Funktion
[Leicht verständliche Erklärung! ] Verwendung von ArrayList [Java]
[Java] Verwendung der Calendar-Klasse
[Java] Erfahren Sie, wie Sie Optional richtig verwenden
[Leicht verständliche Erklärung! ] Verwendung von Java-Überladung
try-catch-finally Ausnahmebehandlung Verwendung von Java
[Leicht verständliche Erklärung! ] Verwendung der Java-Kapselung
Verwenden Sie jenv, um mehrere Java-Versionen zu aktivieren
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Verwendung des Java-Frameworks mit AWS Lambda! ??
Ich möchte Java8 für jeden mit Index verwenden
Verwendung der Java-API mit Lambda-Ausdrücken
Verwenden Sie Matplotlib aus Java oder Scala mit Matplotlib4j
[Leicht verständliche Erklärung! ] Verwendung der Java-Vererbung [Erklärung überschreiben]
[Java] Einführung in Java
Verwendung der replace () -Methode (Java Silver)
[Java] Verwenden Sie Collectors.collectingAndThen