Gemäß der Vereinbarung sollten Sie bei der Verwendung der Java-Programmierung so weit wie möglich vorhandene Klassenbibliotheken verwenden. Natürlich können Sie auch selbst eine Sortiermethode oder ein Framework schreiben, aber wie viele Leute können besser schreiben als diejenigen im JDK? Ein weiterer Vorteil der Verwendung vorhandener Klassen besteht darin, dass der Code einfach zu lesen und zu warten ist. In diesem Artikel geht es hauptsächlich um die Verwendung vorhandener Klassenbibliotheken zum Sortieren von Arrays und verschiedenen Sammlungscontainern (einige Beispiele im Artikel stammen aus „Java Developers Almanac 1.4“). )
Zunächst müssen Sie zwei Klassen kennen: java.util.Arrays und java.util.Collections (beachten Sie den Unterschied zu Collection). Collection ist die Schnittstelle der obersten Ebene des Collection-Frameworks, und Collections enthält viele statische Methoden. Wir verwenden Arrays zum Sortieren von Arrays und Collections zum Sortieren kombinierter Frame-Container wie ArraysList, LinkedList usw.
Import java.util.* und andere Shell-Codes, wie Klassen und statische Hauptmethoden, müssen zu den Beispielen hinzugefügt werden. Ich werde alle Codes im ersten Beispiel schreiben und sie im Folgenden ausnahmslos weglassen.
Array sortieren
Es gibt beispielsweise ein Array von Ganzzahlen:
Kopieren Sie den Codecode wie folgt:
int[] intArray = new int[] {4, 1, 3, -23};
Wie sortieren wir es? Denken Sie derzeit über den Schnellsortierungsalgorithmus nach? Schauen Sie sich an, wie das geht:
Kopieren Sie den Codecode wie folgt:
import java.util.*;
öffentliche Klasse Sortieren{
public static void main(String[] args){
int[] intArray = new int[] {4, 1, 3, -23};
Arrays.sort(intArray);
}
}
Auf diese Weise verwenden wir die statische Methode sort() von Arrays, um das intArray in aufsteigender Reihenfolge zu sortieren, und jetzt ist das Array zu {-23,1,3,4} geworden.
Wenn es sich um ein Zeichenarray handelt:
Kopieren Sie den Codecode wie folgt:
String[] strArray = new String[] {"z", "a", "C"};
Wir verwenden:
Kopieren Sie den Codecode wie folgt:
Arrays.sort(strArray);
Das Ergebnis nach der Sortierung ist {C, a, z}, und sort() sortiert in aufsteigender Reihenfolge entsprechend der natürlichen Reihenfolge der Elemente. Wenn Sie die Groß-/Kleinschreibung nicht berücksichtigen möchten, können Sie Folgendes schreiben:
Kopieren Sie den Codecode wie folgt:
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Natürlich können wir auch einen bestimmten Abschnitt des Arrays zum Sortieren angeben. Wenn wir beispielsweise die Teile 0-2 des Arrays sortieren möchten (vorausgesetzt, die Array-Länge ist größer als 3), bleiben die anderen Teile unverändert kann verwenden:
Kopieren Sie den Codecode wie folgt:
Arrays.sort(strArray,0,2);
Auf diese Weise sortieren wir nur die ersten drei Elemente, ohne die folgenden Teile zu beeinflussen.
Natürlich werden einige Leute denken: Wie sortiere ich in absteigender Reihenfolge? Unter den vielen Sortiermethoden lautet eine Kopie des Codes wie folgt:
sort(T[] a, Comparator<? super T> c)
Wir können Comparator verwenden, um einen Comparator in umgekehrter Reihenfolge zu erhalten. Nehmen Sie das vorherige intArray [] als Beispiel.
Kopieren Sie den Codecode wie folgt:
Arrays.sort(intArray,Comparator.reverseOrder());
Auf diese Weise erhalten wir das Ergebnis {4,3,1,-23}. Wenn wir den Originalcode nicht ändern möchten, können wir auch Folgendes verwenden:
Kopieren Sie den Codecode wie folgt:
Collections.reverse(Arrays.asList(intArray));
Holen Sie sich die umgekehrte Reihenfolge des Arrays. Das Ergebnis ist ebenfalls 4,3,1,-23}.
Jetzt hat sich die Situation geändert. Unser Array ist kein Array mit primitivem Datentyp (Primitivtyp) oder String-Typ mehr, sondern ein Array mit Objekten. Die natürliche Reihenfolge dieses Arrays ist unbekannt, daher müssen wir die Comparable-Schnittstelle für diese Klasse implementieren. Wir haben beispielsweise eine Name-Klasse:
Kopieren Sie den Codecode wie folgt:
Klassenname implementiert Comparable<Name>{
public String firstName,lastName;
öffentlicher Name(String Vorname,String Nachname){
this.firstName=firstName;
this.lastName=lastName;
}
public int CompareTo(Name o) { //Implementieren Sie die Schnittstelle
int lastCmp=lastName.compareTo(o.lastName);
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
}
public String toString(){ //Praktisch für Ausgabetests
return Vorname+" "+Nachname;
}
}
Auf diese Weise vergleichen wir beim Sortieren dieses Objektarrays zuerst den Nachnamen, dann den Vornamen und ermitteln dann die Reihenfolge der beiden Objekte, genau wie es in CompareTo (Name o) implementiert ist. Versuchen Sie es doch mal mit dem Programm:
Kopieren Sie den Codecode wie folgt:
import java.util.*;
öffentliche Klasse NameSort {
public static void main(String[] args) {
Name nameArray[] = {
neuer Name("John", "Lennon"),
neuer Name("Karl", "Marx"),
neuer Name("Groucho", "Marx"),
neuer Name("Oscar", "Grouch")
};
Arrays.sort(nameArray);
for(int i=0;i<nameArray.length;i++){
System.out.println(nameArray[i].toString());
}
}
}
Das Ergebnis ist wie erwartet:
Kopieren Sie den Codecode wie folgt:
Oscar Grouch
John Lennon
Groucho Marx
Karl Marx
Sammlungsrahmen sortieren
Wenn Sie Arrays.sort() zum Sortieren von Arrays verstanden haben, ist die Verwendung des Collection-Frameworks ähnlich. Ersetzen Sie einfach Arrays durch Collections. Beachten Sie, dass Collections eine Klasse und Collection eine Schnittstelle ist. Obwohl es nur einen Unterschied gibt, sind ihre Bedeutungen völlig unterschiedlich.
Angenommen, es gibt eine solche verknüpfte Liste:
Kopieren Sie den Codecode wie folgt:
LinkedList list=new LinkedList();
list.add(4);
list.add(34);
list.add(22);
list.add(2);
Wir müssen nur Folgendes verwenden:
Kopieren Sie den Codecode wie folgt:
Collections.sort(list);
Sie können die Elemente in ll von klein nach groß sortieren, und das Ergebnis wird:
Kopieren Sie den Codecode wie folgt:
[2, 4, 22, 34]
Wenn die Elemente in der LinkedList Strings sind, werden sie wie die Basisdatentypen ebenfalls von klein nach groß sortiert.
Wenn Sie eine umgekehrte Sortierung implementieren möchten, also von der Sortierung bis zur kleinen Sortierung:
Kopieren Sie den Codecode wie folgt:
Collections.sort(list,Collectons.reverseOrder());
Wenn es sich bei den Elementen in der LinkedList um benutzerdefinierte Objekte handelt, können Sie die Comparable-Schnittstelle wie das Name-Objekt oben implementieren und sie dann von Collection.sort() für Sie sortieren lassen.
Wenn Sie ein Objekt nach Ihren eigenen Vorstellungen sortieren möchten, können Sie den kopierten Code wie folgt verwenden:
sort(List<T> list, Comparator<? super T> c)
Diese Methode führt eine Sortierung durch. Bevor wir ein Beispiel geben, müssen wir zunächst die Verwendung von Comparator und das Format der Comparable-Schnittstelle erklären:
Kopieren Sie den Codecode wie folgt:
öffentliche Schnittstelle Comparator<T> {
int vergleichen(T o1, T o2);
}
Tatsächlich ähnelt die Schreibmethode von int Compare(T o1,T o2) in Comparator der Schreibmethode der Methode CompareTo() in Comparable. In der obigen Name-Klasse beginnt unser Vergleich mit LastName. In China möchten wir den Vergleich mit fristName beginnen, ohne den ursprünglichen Code zu ändern:
Kopieren Sie den Codecode wie folgt:
final Comparator<Name> FIRST_NAME_ORDER=new Comparator<Name>() {
public int vergleichen(Name n1, Name n2) {
int firstCmp=n1.firstName.compareTo(n2.firstName);
return (firstCmp!=0?firstCmp:n1.lastName.compareTo
(n2.vorname));
}
};
Auf diese Weise wird unser angepasster Komparator FIRST_NAME_ORDER geschrieben.
Konvertieren Sie das Namensarray im vorherigen Beispiel in eine Liste:
Kopieren Sie den Codecode wie folgt:
List<Name> list=Arrays.asList(nameArray);
Collections.sort(list,FIRST_NAME_ORDER);
Auf diese Weise haben wir die Sortierung mithilfe unseres eigenen definierten Komparators erfolgreich eingestellt.