Vorwort
Wenn es sich auf den Vergleich des Vergleichs der "Größe" von zwei Objekten bei der Durchführung von Algorithmen wie Insertion -Sortier-, Hügelsortier- und Zusammenführungssorten bezieht. Es ist leicht, die Vergleichsmethode der Ganzzahl i> j zu verstehen, aber wenn wir mehrere Objekte sortieren, wie vergleichen wir die "Größe" von zwei Objekten? Solche Vergleiche von stu1> stu2 sind offensichtlich unmöglich zu kompilieren. Um das Problem zu lösen, wie die Größe von zwei Objekten verglichen wird, bietet JDK zwei Schnittstellen java.lang.Comparable und java.util.Comparator .
1. natürliche Sortierung: java.lang.comparable
In der vergleichbaren Schnittstelle gibt es nur eine Methode: compareTo(Object obj) , und der Rückgabewert dieser Methode ist int. Wenn der Rückgabewert eine positive Zahl ist, bedeutet dies, dass das aktuelle Objekt (das Objekt, das die Methode aufruft) "größer" ist als das OBJ -Objekt; Ansonsten ist es "klein"; Wenn es Null ist, bedeutet dies, dass die beiden Objekte gleich sind.
Hier ist eine Schülerklasse, die die vergleichbare Schnittstelle implementiert:
Schüler der öffentlichen Klasse implementiert vergleichbar {private int id; privater Zeichenfolge Name; public student () {super (); } @Override public int vergleicheto (Objekt obj) {if (obj instance von student) {student stu = (student) obj; return id - stu.id; } return 0; } @Override public String toString () {return "<" + id + "," + name + ">"; }} Schüler implementiert die natürliche Sortierschnittstelle vergleichbar. Wie verwenden wir diese Schnittstelle, um einen Satz von Studentenobjekten zu sortieren? Als wir Arrays lernten, verwendeten wir eine Klasse, um die Ganzzahlarrays zu sortieren: java.util.Arrays . Wir verwenden Arrays 'Sortiermethode, um Ganzzahlarrays zu sortieren. Nachdem Sie die API -Dokumentation durchgeflippt haben, werden Sie feststellen, dass Arrays viele überladene Formen der Sortiermethode angeben, einschließlich sort(Object[] obj) , was bedeutet, dass Arryas auch Objekt -Arrays sortieren können. Beim Vergleich der "Größe" der beiden Objekte während des Sortierprozesses wird die vergleichbare Schnittstelle zum Vergleich der Vergleichsmethode verwendet.
public class vergleichEst {public static void main (String [] args) {Student stu1 = neuer Schüler (1, "Little"); Student stu2 = neuer Schüler (2, "Cyntin"); Student stu3 = neuer Schüler (3, "Tony"); Student stu4 = neuer Schüler (4, "Gemini"); Student [] stus = neuer Schüler [4]; stu0] = stu1; stu1 [1] = stu4; Stus [2] = Stu3; stu3] = stu2; System.out.println ("Array:" + arrays.toString (Stus)); Arrays.sort (Stus); System.out.println ("sort:" + arrays.toString (stus)); }} Die Reihenfolge, in der Elemente im Student -Array hinzugefügt werden, wird gemäß der Student -ID nicht hinzugefügt. Sortieren Sie nach dem Aufrufen Arrays.sort(stus) das Student -Array. Unabhängig davon, welcher Sortalgorithmus zur Implementierung verwendet wird, ist es definitiv erforderlich, den "Größen" -Betrieb zweier Objekte zu vergleichen. Wie vergleichen Sie also die "Größe" von zwei Objekten? Die vom Schüler implementierte vergleichbare Schnittstelle kommt ins Spiel. Die Sortiermethode wirft das zu vergleichen vergleichbare Objekt und ruft die Vergleichsmethode auf, um die "Größe" dieser beiden Objekte anhand ihres Rückgabewerts zu beurteilen. Daher wird in diesem Beispiel das ursprüngliche studentische Array, das nicht bestellt wird, zu einem Student-Array, der nach Studentennummer sortiert ist.
Wir haben jedoch festgestellt, dass der Sortieralgorithmus an die Schülerklasse gebunden ist und der Schüler nur einen Sortieralgorithmus hat. Dies ist jedoch in der realen Gesellschaft nicht der Fall. Was ist, wenn wir nicht nach Studentennummer sortieren wollen? Was ist, wenn wir Schüler nach Namen sortieren wollen? Wir können nur die Vergleichsmethode der vergleichbaren Schnittstelle der Schülerklasse ändern und sie nach Namen sortieren. Was ist, wenn es zwei Operationen im selben System gibt, eine sortiert nach Studentennummer und der andere wird nach Namen sortiert? Es ist unmöglich, zwei Vergleichsmethoden implementiert zu schreiben. Aus dieser Sicht hat vergleichbar Einschränkungen. Um diesen Manko auszugleichen, bietet JDK uns auch eine andere Sortiermethode, nämlich die Vergleichssortierung, über die wir unten sprechen werden.
2. Vergleichssortier: java.util.comParator
Ich habe oben erwähnt, dass der Grund, warum die Komparatorsortierschnittstelle bereitgestellt wird, darin besteht, dass es manchmal notwendig ist, dasselbe Objekt auf viele verschiedene Arten zu sortieren, und diese natürliche Sortierung kann nicht implementiert werden. Darüber hinaus besteht ein Vorteil der Komparatorschnittstelle darin, dass der Vergleichssortieralgorithmus von der spezifischen Entitätsklasse getrennt wird.
Wenn Sie durch die API schauen, werden Sie feststellen, dass es auch eine überlastete Form von Arrays.Sort: sort(T[] a, Comparator<? super T> c) gibt. Die Methode verwendet Generika, um Parameter dieser Methode zu schreiben, die wir noch nicht erwähnt haben. Wir können es als diese Form verstehen: sort(Object[] a, Comparator c) , was bedeutet, dass das Objektarray nach dem Vergleichssortieralgorithmus sortiert wird, das durch den Vergleich C angegeben wird. In der Komparator -Schnittstelle sind zwei Methoden definiert: compare(Object o1, Object o2) und equals Methoden. Da die equals -Methode Methoden für alle Objekte enthält, müssen wir bei der Implementierung der Komparatorschnittstelle nur compare überschreiben, anstatt die equals -Methode zu überschreiben. Die Beschreibung der übergeordneten Equals -Methode in der Komparatorschnittstelle lautet: "Beachten Sie, dass es immer sicher ist, Object.equals(Object) . Wir müssen nur den ersten Satz kennen und es ist in Ordnung. Das heißt, wir müssen nicht darüber nachdenken, wie die Equals -Methode implementiert werden soll, denn selbst wenn wir die Implementierung der Equals -Methode nicht zeigen, sondern die Equals -Methode der Objektklasse verwenden, ist der Code immer noch sicher.
Schreiben wir also einen Code, um ihn mit einem Komparator zu sortieren. Es wird immer noch mit der Schülerklasse gemacht, aber die vergleichbare Schnittstelle wird nicht implementiert. Da die Kompleximplementierungsklasse nur Anzeige verwendet, um eine Methode zu implementieren, müssen wir keine Klasse schreiben, um sie zu implementieren. Wenn wir einen Komparator verwenden müssen, können wir eine anonyme interne Klasse schreiben, um den Komparator zu implementieren.
Hier ist unsere Methode zum Namen nach Namen:
public void sortbyName () {Student stu1 = neuer Schüler (1, "Little"); Student stu2 = neuer Schüler (2, "Cyntin"); Student stu3 = neuer Schüler (3, "Tony"); Student stu4 = neuer Schüler (4, "Gemini"); Student [] stus = neuer Schüler [4]; stu0] = stu1; stu1; stu4; stu2] = stu3; stu3] = stu2; System.out.println ("Array:" + arrays.toString (Stus)); Arrays.sort (stus, neuer vergleicher () {@Override public int compare (Objekt O1, Objekt O2) {if (O1 Instanz von Student && O2 Instanz) {Student S1 = (Student) O1; Student S2 = (Student) O2; // Return s1.getid () - S2.Getid (); //) ID ID ID ID ID ID ID ID ID); s1.getName (). Vergleiche (S2.GetName ()); System.out.println ("sortiert:" + arrays.toString (stus)); }Wenn wir die Schüler nach Schülernummer sortieren müssen, müssen wir den Code in der inneren Klasse nur ändern, der den Komparator in unserer Sortiermethode implementiert, ohne die Schülerklasse zu ändern.
Hinweis: Natürlich können Sie auch die Schülerklasse verwenden, um die Komparatorschnittstelle zu implementieren, so dass der Schüler (ist a) vergleicher (Vergleicher). Wenn Sie diese Sortierung verwenden müssen, verwenden Sie Schüler einfach als Komparator. Sie können Schüler als Parameter in die Sortiermethode übergeben, da der Schüler ein Vergleicher ist. Ein solcher Code ist jedoch kein hervorragender Code, da einer der wichtigsten Gründe, warum wir den Komparator verwenden, darin besteht, dass er den Vergleichsalgorithmus von bestimmten Klassen trennen und die Kopplung zwischen Klassen verringern kann.
Treeset unterstützt beide Vergleichsmethoden, die den beiden Konstruktormethoden von Treeset entsprechen:
1..
2. Treeset (Komparator -Komparator): Vergleichs- und Sortierelemente in Treeset gemäß dem gegebenen Komparator -Komparator
Beim Hinzufügen eines Elements zu einem Treeset sortiert der Treeset die Elemente. Ob Sie mit natürlicher Reihenfolge oder Vergleicher sortieren möchten, hängt es davon ab, wie Ihr Treeset -Konstrukt geschrieben wird. Natürlich wird es keinen Vergleich geben, wenn das erste Element hinzugefügt wird. Es gibt keine Elemente im Treeset. Mit wem kann ich vergleichen?
Im Folgenden werden der Treeset -Testcode mit zwei Sortier- und Vergleichsmethoden angegeben:
/ *** Verwenden Sie die natürliche Sortierung* Der Schüler muss die vergleichbare Schnittstelle implementieren, andernfalls wird ClassCastException geworfen*/ public void testsortedSet3 () {Student stu1 = neuer Schüler (1, "Little"); Student stu2 = neuer Schüler (2, "Cyntin"); Student stu3 = neuer Schüler (3, "Tony"); Student stu4 = neuer Schüler (4, "Gemini"); SortEdSet set = new treeset (); set.add (stu1); set.add (stu3); // Wenn der Schüler die vergleichbare Schnittstelle nicht implementiert, throw classCastException set.add (STU4); set.add (stu2); set.add (stu4); set.add (neuer Schüler (12, "klein")); System.out.println (set); } / *** Verwenden Sie den Komparator zum Sortieren* Student kann nur eine einfache Java -Klasse sein, ohne die vergleichbare Schnittstelle zu implementieren Student stu2 = neuer Schüler (2, "Cyntin"); Student stu3 = neuer Schüler (3, "Tony"); Student stu4 = neuer Schüler (4, "Gemini"); SortEdSet set = new treeset (neuer vergleicher () {@Override public int compare (Objekt O1, Objekt O2) {if (O1 Instanz von Studenten && O2 Instanz) {Student S1 = (Student) O1; Student S2 = (Student) O2; Return S1.getname (). set.add (stu1); set.add (stu3); set.add (stu4); set.add (stu2); set.add (stu4); set.add (neuer Schüler (12, "klein")); System.out.println (set); } Stellen Sie außerdem eine Werkzeugkurs vor, java.util.Collections . Beachten Sie, dass dies keine Sammelschnittstelle ist. Sammlungen sind der Arrays -Klasse sehr ähnlich. Arrays bietet eine Reihe statischer Methoden für Array -Operationen, Sortierung und mehr. Sammlungen liefern auch eine Reihe solcher Methoden, wird jedoch verwendet, um Sammlungen zu verarbeiten. Obwohl die Sammlungsklasse der Kollektionsschnittstelle sehr ähnlich ist, lassen Sie sich nicht unter dem Namen der Sammlungen täuschen. Es handelt sich nicht um eine Implementierungsklasse, die nur die Sammelschnittstelle und die Unterinterfierungen verarbeiten kann, sondern auch die Implementierungsklasse der Kartenschnittstelle verarbeiten kann.
Zusammenfassen
Dies ist das Ende der Einführung in die natürliche Sortier- und Komparatorsortierung in Java. Der Artikel ist noch relativ detailliert. Ich hoffe, es kann Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.