logo

Vergleichbar mit Komparator in Java

Java bietet zwei Schnittstellen zum Sortieren von Objekten mithilfe von Datenmitgliedern der Klasse:

  1. Vergleichbar
  2. Komparator

Verwendung einer vergleichbaren Schnittstelle



Java-Concat-Strings

Ein vergleichbares Objekt ist in der Lage, sich mit einem anderen Objekt zu vergleichen. Die Klasse selbst muss das implementieren java.lang.Comparable Schnittstelle zum Vergleich seiner Instanzen.
Stellen Sie sich eine Filmklasse vor, die Mitglieder wie Bewertung, Name und Jahr hat. Angenommen, wir möchten eine Liste von Filmen nach Erscheinungsjahr sortieren. Wir können die Comparable-Schnittstelle mit der Movie-Klasse implementieren und die Methode CompareTo() der Comparable-Schnittstelle überschreiben.

Java








// A Java program to demonstrate use of Comparable> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable> {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Driver class> class> Main> {> >public> static> void> main(String[] args)> >{> >ArrayList list =>new> ArrayList();> >list.add(>new> Movie(>'Force Awakens'>,>8.3>,>2015>));> >list.add(>new> Movie(>'Star Wars'>,>8.7>,>1977>));> >list.add(>new> Movie(>'Empire Strikes Back'>,>8.8>,>1980>));> >list.add(>new> Movie(>'Return of the Jedi'>,>8.4>,>1983>));> >Collections.sort(list);> >System.out.println(>'Movies after sorting : '>);> >for> (Movie movie: list)> >{> >System.out.println(movie.getName() +>' '> +> >movie.getRating() +>' '> +> >movie.getYear());> >}> >}> }>

>

>

Ausgabe

Movies after sorting : Star Wars 8.7 1977 Empire Strikes Back 8.8 1980 Return of the Jedi 8.4 1983 Force Awakens 8.3 2015>

Angenommen, wir möchten Filme auch nach ihrer Bewertung und ihrem Namen sortieren. Wenn wir ein Sammlungselement vergleichbar machen (indem wir es Comparable implementieren lassen), erhalten wir nur eine Chance, die Methode CompareTo() zu implementieren. Die Lösung ist die Verwendung Komparator.

Verwenden des Komparators

Im Gegensatz zu Comparable ist Comparator außerhalb des Elementtyps, den wir vergleichen. Es ist eine eigene Klasse. Wir erstellen mehrere separate Klassen (die Comparator implementieren), um sie anhand verschiedener Mitglieder zu vergleichen.
Die Collections-Klasse verfügt über eine zweite sort()-Methode und verwendet Comparator. Die Methode sort() ruft Compare() auf, um Objekte zu sortieren.

Um Filme nach Bewertung zu vergleichen, müssen wir drei Dinge tun:

  1. Erstellen Sie eine Klasse, die Comparator implementiert (und damit die Methode Compare(), die die Arbeit erledigt, die zuvor von CompareTo() erledigt wurde).
  2. Erstellen Sie eine Instanz der Comparator-Klasse.
  3. Rufen Sie die überladene Methode sort() auf und geben Sie ihr sowohl die Liste als auch die Instanz der Klasse, die Comparator implementiert.

Java




// A Java program to demonstrate Comparator interface> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Class to compare Movies by ratings> class> RatingCompare>implements> Comparator {> >public> int> compare(Movie m1, Movie m2)> >{> >if> (m1.getRating() return -1; if (m1.getRating()>m2.getRating()) return 1; sonst 0 zurückgeben; } } // Klasse zum Vergleichen von Filmen nach Namen class NameCompare implementiert Comparator { public int Compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Treiberklasse class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new Movie('Force Awakens', 8.3, 2015)); list.add(new Movie('Star Wars', 8.7, 1977)); list.add( neuer Film('Empire Strikes Back', 8.8, 1980)); list.add( neuer Film('Die Rückkehr der Jedi-Ritter', 8.4, 1983)); // Nach Bewertung sortieren: (1) Erstellen Sie ein Objekt von // RatingCompare // (2) Rufen Sie Collections.sort auf // (3) Drucken Sie die sortierte Liste System.out.println('Sorted by Rating'); RatingCompare RatingCompare = new RatingCompare(); Collections.sort(list, RatingCompare); for (Film: Liste) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Überladene Sortiermethode mit RatingCompare aufrufen // (Die gleichen drei Schritte wie oben) System.out.println(' Sorted by name'); NameCompare nameCompare = new NameCompare(); Collections.sort(list, nameCompare); for (Film: Liste) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Verwendet Comparable zum Sortieren nach Jahr System.out.println(' Sorted by year'); Collections.sort(list); for (Movie movie : list) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>

>

Was ist in Python?

>

Ausgabe:

Sorted by rating 8.3 Force Awakens 2015 8.4 Return of the Jedi 1983 8.7 Star Wars 1977 8.8 Empire Strikes Back 1980 Sorted by name Empire Strikes Back 8.8 1980 Force Awakens 8.3 2015 Return of the Jedi 8.4 1983 Star Wars 8.7 1977 Sorted by year 1977 8.7 Star Wars 1980 8.8 Empire Strikes Back 1983 8.4 Return of the Jedi 2015 8.3 Force Awakens>
  • Comparable ist für Objekte mit natürlicher Ordnung gedacht, was bedeutet, dass das Objekt selbst wissen muss, wie es geordnet werden soll. Zum Beispiel die Anzahl der Schüler. Die Sortierung der Comparator-Schnittstelle erfolgt hingegen über eine separate Klasse.
  • Logischerweise vergleicht die Comparable-Schnittstelle diese Referenz mit dem angegebenen Objekt und Comparator in Java vergleicht zwei verschiedene bereitgestellte Klassenobjekte.
  • Wenn eine Klasse die Comparable-Schnittstelle in Java implementiert, kann die Sammlung dieses Objekts, entweder List oder Array, mithilfe der Methoden Collections.sort() oder Arrays.sort() automatisch sortiert werden, und die Objekte werden basierend auf ihrer natürlichen Reihenfolge sortiert, die durch die Methode CompareTo definiert wird.
  • Ein grundlegendes Unterscheidungsmerkmal besteht darin, dass wir bei der Verwendung von „Vergleichbar“ nur einen Vergleich verwenden können. Für einen bestimmten Typ können wir hingegen mehr als einen benutzerdefinierten Komparator schreiben, der jeweils unterschiedliche Interpretationen der Sortierung verwendet. Wie im Vergleichsbeispiel konnten wir nur nach einem Attribut sortieren, nämlich dem Jahr, aber im Komparator konnten wir auch andere Attribute wie Bewertung, Name und Jahr verwenden.

Zusammenfassend lässt sich sagen: Wenn die Sortierung von Objekten auf natürlicher Reihenfolge basieren muss, verwenden Sie Comparable. Wenn die Sortierung jedoch anhand von Attributen verschiedener Objekte erfolgen muss, verwenden Sie Comparator in Java.