Treeset unterstützt zwei Sortiermethoden: natürliche Sortierung und individuelle Sortierung. Treeset verwendet standardmäßig eine natürliche Sortierung.
1. natürliche Sortierung
Treeset nennt die Vergleiche (Object OBJ) -Methode des Sammelelements, um die Größenbeziehung zwischen Elementen zu vergleichen und dann die Sammelelemente in aufsteigender Reihenfolge anzuordnen. (PREPONDE zum Vergleich: Die beiden Objekte haben den gleichen Typ).
Java liefert eine vergleichbare Schnittstelle, die eine Vergleichs -Objekt -OBJ -Methode definiert, die einen ganzzahligen Wert zurückgibt. Wenn ein Objekt die Methode aufruft, um mit einem anderen Objekt zu vergleichen, z. obj2;
Gemeinsame Java -Klassen implementieren eine vergleichbare Schnittstelle und bieten Standards für vergleichende Größen. Gemeinsame Klassen, die eine vergleichbare Schnittstelle implementieren:
Wenn Sie versuchen, einem Treeset ein Objekt hinzuzufügen, muss die Klasse des Objekts die vergleichbare Schnittstelle implementieren.
Im folgenden Programm wird ein Fehler gemeldet:
Klasse err {} public class testTreesTerror {public static void main (String [] args) {treeset ts = new treeset (); add (neuer err ());veranschaulichen:
Das obige Programm versucht, 2 ERR -Objekte in die Treeset -Sammlung hinzuzufügen. Die Methode der Objekt) wird mit anderen Elementen in der Sammlung verglichen - Wenn die entsprechende Klasse die vergleichbare Schnittstelle nicht implementiert, wird eine ClassCastException angehoben. Wenn Sie versuchen, das erste Element des Elements aus dem Treeset zu entfernen, wird eine ClassCastException -Ausnahme noch erhöht.
Beim Vergleich von Objekten mithilfe der Vergleichsmethode (Object OBJ) muss der Typ des verglichenen Objekts OBJ auf denselben Typ gegossen werden, da nur zwei Instanzen derselben Klasse die Größe vergleichen können. Das heißt, das dem Treeset hinzugefügte Objekt sollte derselben Klasse haben, sonst wird eine ClassCastException angehoben. Wenn Sie beispielsweise einem Treeset ein String -Objekt hinzufügen, ist diese Operation völlig normal. Beim Hinzufügen des zweiten Date -Objekts ruft Treeset die Vergleiche (Object OBJ) -Methode des Objekts auf, um sie mit anderen Elementen in der Sammlung zu vergleichen, und das Programm wird zu diesem Zeitpunkt eine Ausnahme ausgelöst.
In der tatsächlichen Programmierung können Programmierer ihre eigenen Klassen so definieren, dass sie TreeSet mehrere Arten von Objekten hinzufügen, vorausgesetzt, die benutzerdefinierte Klasse implementiert die vergleichbare Schnittstelle. . Bei der Betriebsdaten in Treeset treten jedoch ClassCastexceptio -Ausnahmen für Elemente verschiedener Typen auf. (Sie werden verstehen, nachdem Sie sorgfältig gelesen werden)
Wenn die Treeset -Sammlung ein Objekt hinzugefügt wird, ruft Treeset die Vergleichsmethode des Objekts (Object OBJ) auf, um die Größe mit anderen Objekten im Container zu vergleichen, und bestimmt dann den Speicherort basierend auf dem roten und schwarzen Baumalgorithmus. Wenn zwei Objekte mit Vergleiche (Object OBJ) gleich verglichen werden, betrachtet Treeset sie für den gleichen Standort.
Für Treeset -Sammlungen ist das Kriterium zur Bestimmung, dass zwei Objekte nicht gleich sind: Zwei Objekte geben durch den Equals -Methodenvergleich Fehl wird auch als zwei Objekte verarbeitet.
Das folgende Programm zeigt:
// Die Z -Klasse hat die Equals -Methode immer falsch geschrieben, // die Vergleiche (Object OBJ) -Methode gibt immer eine positive Ganzzahl -Klasse -Z -Klasse zurück. } public boolean Equals (Objekt obj) {return false; Z1 = neu z (6); set) // das Altersattribut des ersten Elements des SET (z) (set.first ()). Alter = 9; Sehen wird auch 9 system.out.println ((z) (set.last ()). Alter);Programmauslaufergebnisse:
WAHR
[Treeset.z@1fb8ee3, treeset.z@1fb8ee3]
9
veranschaulichen:
Das gleiche Objekt wird zweimal im Programm hinzugefügt, da die Equals () -Methode des Z1 -Objekts immer False zurückgibt und die Vergleiche (Object OBJ) -Methode immer zurückgibt 1. Auf diese Weise wird Treeset denken, dass sich das Z1 -Objekt von sich selbst unterscheidet. Fügen Sie dem Treeset zwei Z1 -Objekte hinzu. Die beiden vom Treeset -Objekt gespeicherten Elemente sind tatsächlich das gleiche Element. Daher ändert sich auch das Altersattribut des letzten Elements in der Treeset -Sammlung, nachdem das Altersattribut des ersten Elements in der Treeset -Sammlung geändert wurde.
Zusammenfassung : Wenn Sie ein Objekt in Treeset einfügen und die Equals () -Methode der entsprechenden Klasse des Objekts neu schreiben müssen, sollten Sie sicherstellen, dass die Methode mit der Vergleichs -Objekt -Methode konsistente Ergebnisse hat. Zwei Objekte passieren, wenn der Equals -Methodenvergleich true zurückgibt. Die beiden Objekte sollten 0 zurückgeben, indem die Vergleichsmethode (Object OBJ) verglichen wird.
Wenn zwei Objekte mit der Equals -Methode verglichen werden, die beiden Objekte jedoch mit der Vergleichs -( -Object -OBJ) -Methode verglichen werden und nicht zurückgeben. Dies führt dazu, dass Treeset die beiden Objekte an verschiedenen Stellen speichert, damit beide Objekte dies können erfolgreich hinzugefügt werden, was sich etwas von den Regeln der festgelegten Sammlungen unterscheidet.
Wenn zwei Objekte 0 zurücksenden Der gleiche Ort, aber es funktioniert eigentlich nicht (sonst bleibt nur noch ein Objekt übrig), daher ist es schwieriger zu handhaben.
Wenn einem Treeset ein veränderliches Objekt hinzugefügt wird und das nachfolgende Programm die Eigenschaften des veränderlichen Objekts verändert und die Größenreihenfolge mit anderen Objekten ändert, der Treeset nicht erneut anpasst und es sogar dazu veranlasst, es zu speichern Im Treeset diese beiden Objekte geben sie durch Vergleich der Equals -Methode zurück, und die Vergleichsmethode (Object OBJ) gibt 0 zurück.
Das folgende Programm zeigt:
Klasse R {int count; if (obj Instance von r) {r r = (r) obj; class testhashset2 {public static void main (String [] args) {Hashset HS = new Hashset (); R (9)); .Iderator (); in keiner sequentiellen Status system.out.println (HS); -3 r Objekt? 5)));Programmauslaufergebnisse:
[R (Zählattribut: -3), R (Zählattribut: -2), R (Zählattribut: 5), R (Zählattribut: 9)]
[R (Zählattribut: 20), R (Zählattribut: -2), R (Zählattribut: 5), R (Zählattribut: -2)]
[R (Zählattribut: 20), R (Zählattribut: -2), R (Zählattribut: 5), R (Zählattribut: -2)]
[R (Zählattribut: 20), R (Zählattribut: -2), R (Zählattribut: -2)]
veranschaulichen:
Das R -Objekt im obigen Programm ist ein normales Umschreiben der Equals -Methode und der vergleichbaren Methodenklasse. Sie können sehen, dass die erste Ausgabe des Programms ordentlich angeordnet ist. Wenn die Grafeigenschaft des R -Objekts geändert wird, ändert sich auch das Ausgabeergebnis des Programms und enthält doppelte Elemente. Sobald die Eigenschaften von variablen Elementen in der Treeset -Sammlung geändert werden, wird Treeset nicht gelöscht (auch Elemente, die in der Sammlung originell sind Elemente können nicht gelöscht werden).
Wenn ein R -Objekt mit -2, werden keine Elemente gelöscht.
Zusammenfassung: Mit Hashset ist es beim Umgang mit diesen Objekten sehr komplex und fehleranfällig. Um das Programm robuster zu gestalten, wird empfohlen, nur unveränderliche Objekte in die Hashset- und Treeset -Sammlungen zu platzieren.
2. Custom Sorting
Die natürliche Art von Treeset basiert auf der Größe der Sammelelemente, und Treeset arrangiert sie in aufsteigender Reihenfolge. Wenn Sie eine benutzerdefinierte Sortierung implementieren müssen, z. B. absteigende Reihenfolge, können Sie die Komparatorschnittstelle verwenden. Diese Schnittstelle enthält eine Int -Compare -Methode (T O1, T O2), mit der die Größen von O1 und O2 verglichen werden.
Wenn Sie eine maßgeschneiderte Sortierung implementieren müssen, müssen Sie beim Erstellen eines TreeSet -Sammlungsobjekts ein Komparatorobjekt bereitstellen und ein Komparatorobjekt zur Verfügung stellen, das mit der Treeset -Sammlung in Verbindung steht, und das Komparatorobjekt ist für die Sortierlogik der Sammlungselemente verantwortlich.
Das folgende Programm zeigt:
Klasse M {int Alter; main (string [] args) {treeset ts = new treeset (neuer vergleicher () {public int Compare (Objekt O1, Objekt O2) {m m1 = (m) o1; m m2 = (m) o2; if (m1. Alter> m2.age) {return -1; ts.Add (neu (-3));Programmauslaufergebnisse:
[M -Objekt (Alter: 9), M -Objekt (Alter: 5), M -Objekt (Alter: -3)]
veranschaulichen:
Das obige Programm erstellt ein anonymer internes Klassenobjekt der Komparatorschnittstelle, das für die Sortierung der TS -Sammlung verantwortlich ist. Wenn wir also M -Objekte zur TS -Sammlung hinzufügen, müssen die M -Klasse die vergleichbare Schnittstelle nicht implementieren ist verantwortlich für die Sortierung der Sammlungselemente. Bei Verwendung benutzerdefinierter Sortierung sortiert Treeset die Sammlungselemente unabhängig von der Größe des Sammelelements selbst, aber das Komparatorobjekt ist für die Sortierregeln der Sammlungselemente verantwortlich.