In TreeSet, Sortierung und Eindeutigkeit von benutzerdefinierten Objekten basierend auf verschiedenen Eigenschaften

8

Unten ist meine Schülerklasse

%Vor%

letzte Änderung: aber immer noch nicht das richtige Ergebnis

%Vor%

Wenn ich ein Objekt von TreeSet & lt; Student & gt; erzeuge, bekomme ich eine Liste von Student-Objekten basierend auf dem eindeutigen Namen & amp; auch nach Namen geordnet.

Aber ich brauche einen eindeutigen Schülernamen in meinem TreeSet & lt; Student & gt; mit der Reihenfolge nach Schüler-RolleNr.

Ist es mit Komparator möglich? Kann mir jemand helfen, Jeder Vorschlag wird geschätzt. Danke.

UPDATE: Hier ist das komplette Programm:

%Vor%

Update: 2: Danke euch allen für eure Vorschläge, ich brauche noch ein paar mehr:)

%Vor%

AUSGABE :

%Vor%

Freunde, was auch immer ich mit zwei Komparatoren bekommen habe, ist es möglich erreiche das gleiche beim Hinzufügen der Objekte ?? Ich kann nicht zuerst Elemente hinzufügen & amp; Verwenden Sie dann einen neuen Komparator, um die gewünschte Reihenfolge zu erreichen. Ich manipuliere Tausende von Werten, also muss auch die Leistung berücksichtigt werden.

    
SmartSolution 15.12.2010, 06:58
quelle

4 Antworten

5

in TreeSet Es wird Komparator verwendet, während Elemente zum Sortieren und einmaligen Prüfen hinzugefügt werden,

Jetzt ist das Problem, wenn Sie Komparator für Rolle nein verwenden, haben Sie es sortiert nach Rolle nein und eindeutige Rolle nos auch. Sie können nicht beide zusammen im Treeset haben.

Ich würde vorschlagen, dass Sie gehen.

  1. TreeSet Hier konzentrierst du dich auf das Entfernen von Duplikaten
  2. Wenn Sie einmal eindeutige Daten haben, gehen Sie zu ArrayList und sortieren Sie sie in der gewünschten Reihenfolge
Jigar Joshi 16.12.2010 12:37
quelle
4

Bestellung

Die Antwort von @ ralph zur Verwendung eines TreeSet mit einem angegebenen Komparator ist ein guter, benutze das.

Design

Sie sollten das Konzept einer "Studenten-Datenbank" in eine Klasse einfügen, die die richtigen Verhaltensweisen offenlegt und dokumentiert, anstatt nur eine rohe Sammlung zu verwenden. Wenn es darum geht, Listen von Schülern in bestimmten Aufträgen zu entwerfen, legen Sie Methoden offen (vielleicht geben Sie Iterable<Student> zurück, die das sagen. Hinter den Kulissen können Sie je nach Nutzungsmuster eine Vielzahl von Dingen tun:

  • Behalten Sie einen oder mehrere Set s- und% Maps -Studenten nach Interessengebieten.
  • On-Demand-In-Place-Array-Sortierung unter Verwendung von Arrays.sort() und einer angegebenen Comparator .

Beispiel ....

%Vor%

Eindeutigkeit

Sie müssen equals() und hashCode() für Ihre Klasse Student überschreiben, um nur den Namen des Schülers zu vergleichen. Dann erhalten Sie in Ihrem TreeSet eine Eindeutigkeit (stillschweigend). Offensichtlich müssen Sie dann defensiv codieren, um vor dem Einfügen von studentSet.contains(newStudent) zu prüfen, ob newStudent vorhanden ist. Sie wissen also, ob Sie ein Duplikat haben oder nicht.

%Vor%

Wenn dieser Platz vorhanden ist, kann Ihr Code zum Einfügen eines Schülers wie folgt aussehen:

%Vor%

Ihr Baumsatz ist dann voll von Schülern, deren Namen eindeutig sind, und Ihr Hinzufügen-Vorgang meldet einen Fehler, wenn nicht. (Das Auslösen einer Ausnahme ist nur eine mögliche Route und nur dann sinnvoll, wenn ein Student mit einem doppelten Namen tatsächlich eine Ausnahmebedingung ist, aber Sie haben es nicht gesagt.)

    
andersoj 16.12.2010 14:39
quelle
1

Sie können ein neues TreeSet mit einem anderen Vergleicher initialisieren. - Alles, was Sie tun müssen, ist, einen neuen Comparator zu schreiben (implementiert die java.util.Comparator-Schnittstelle), diesen Komparator zu verwenden, um ein neues TreeSet zu initialisieren und dann alle Studenten zum Set hinzuzufügen.

%Vor%

Jedes Tree Set kann einen eigenen Komparator zum Sortieren haben, wenn kein Comparator angegeben ist, dann verwendet das Tree Set die natürliche Reihenfolge der Set-Elemente.

hinzugefügt

Wenn Sie nur den Namen Unique Students benötigen, haben Sie zwei Möglichkeiten:

  • Implementiere den Komparator so, dass er 0 zurückgibt, wenn der Name der Studenten gleich ist (aber ich glaube, das ist so kinde of hack).
  • Filtern Sie zuerst die Schüler nach Namen und sortieren Sie sie anschließend nach rollNo,

Ein bisschen so:

%Vor%     
Ralph 15.12.2010 07:03
quelle
0

Tut mir leid, dass ich hier zu spät bin, hier ist eine elegante Lösung:

%Vor%     
RamonBoza 02.08.2013 08:38
quelle