2016-04-16 15 views
0

Ich habe eine ArrayList erstellt, die Verweise auf Objekte enthält, die verschiedene Datenmengen enthalten.ArrayList - Erstellen von Komparatoren

Ich möchte das Objekt nach bestimmten Elementen ihrer Daten sortieren.

Ich erfolgreich so mit der collections.sort zusammen mit einer anonymen Klasse den neuen Komparator definieren.

Ich war erfolgreich in jedem der neuen Komparatoren, die ich erstellt habe, die in richtig sortierter Reihenfolge resultierten.

Für die gleiche ArrayList wie könnte man einen Komparator machen, der die ursprüngliche Eingabe der ArrayList-Reihenfolge geben würde. Ich weiß, dass die ArrayList die Reihenfolge der Objekte speichert, die sie hinzugefügt werden, Reihenfolge der Reihenfolge. Aber wie würde ich nach dem Sortieren der ArrayList mit anderen Vergleichern die ArrayList dann wieder in die ursprüngliche Reihenfolge sortieren, in der sie sich befand? Das ist die eine Sache, die mich stößt, und ich kann es nicht herausfinden.

Edit: Ich sollte klarstellen, das ist für eine Zuweisung, in der die Anweisungen sagen, um eine Standard/Original-Komparator enthalten, um die unsortierte Eingabe zu bekommen. Das macht für mich keinen Sinn, angesichts dessen, was wir erwähnt haben. Die ArrayList speichert die Anzeigenreihenfolge, wenn sie hinzugefügt wird, aber wenn Sie sortieren, wird sie verloren. Ich sehe nicht, wie Sie einen Vergleicher erstellen könnten, der die ursprüngliche Liste sortiert.

Edit2: Ich habe eine ArrayList, die einige Objekte speichern soll, die einige Datenelemente enthalten, die sortiert werden, etwa nach Namen oder nach Alter. Diese Komparatoren waren einfach zu machen und ich mache das erfolgreich. Die Zuweisung möchte auch einen Originalkomparator, der die Daten so anzeigt, wie sie eingefügt wurden. Jetzt werden diese Komparatoren in einem Methodenaufruf übergeben, in dem diese Methode den Collections.Sort für jeden anderen Komparator verwendet. Es verlangt jedoch, dass der ursprüngliche Komparator zuerst verwendet wird.

Die Idee der ursprünglichen Komparator überhaupt scheint unlogisch. Die Tatsache, dass sie zuerst verwendet wird, so dass keine andere Sortierung durchgeführt wurde, lässt den Schluss zu, dass sie nur so erstellt wurde, dass sie der Argumentliste des Aufrufens der Methode zum Anzeigen der Daten entspricht. Mit anderen Worten, ich denke, der ursprüngliche Komparator sollte nichts zurückgeben.

+3

Ich bin mir nicht sicher, ob ich die Frage verstehe, wie Sie es gepostet haben. Die erste Hälfte scheint völlig unabhängig von der zweiten Hälfte zu sein. Die vorherige Reihenfolge ist nach einer Sortierung verloren, sodass es nicht möglich ist, zum Anzeigenauftrag zurückzukehren, da dies von keinem verfolgt wird. Wenn Sie diese Nachverfolgung benötigen, tun Sie dies buchstäblich, indem Sie Ihr Array nicht sortieren, sondern eine Liste erstellen, die Sie kopieren und sortieren, wobei Sie die ursprüngliche Liste beibehalten. –

+0

Klonen Sie Ihre '' ArrayList'' vor der Sortierung, um den Status zu speichern; und Sie könnten diese Klonkopie später verwenden. –

+1

Wenn es eine Hausaufgabe ist, zeigen Sie die genaue Formulierung, beschreiben Sie es nicht in Ihren eigenen Worten. Beachten Sie jedoch die Frage "Wie stelle ich Hausaufgaben?" (Http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions) Fragen sind oft erfunden und manchmal Unsinn für Leute, die ihren Lebensunterhalt verdienen, versuchen oder gewohnt sind, mit der Sprache, für die Sie Fragen stellen (das fühlt sich an wie in der Nonsense - Kategorie) –

Antwort

0

Es wird jedoch verlangt, dass der ursprüngliche Komparator zuerst verwendet wird. Diese

bedeutet, dass der Komparator nicht benötigt wiederherstellen die ursprüngliche Reihenfolge, die, was würde keinen Sinn machen (unmöglich), aber nichts zu tun, wenn verwendet, zu sortieren, also lassen Sie die Original-Bestellung unverändert.

Zitiert javadoc von sort():

Diese Art ist garantiert stabil sein: gleiche Elemente werden nicht als Folge der Art erst nachbestellt werden.

Dies bedeutet, dass wenn Sie einen Vergleicher übergeben, der alle Objekte für gleich hält, keine Neuordnung stattfindet.

// Java 8 example using lambda expression 
Collections.sort(list, (a,b) -> 0); // No-op. All elements compare equal 
+0

Ja, ich glaube, das ist der richtige Ansatz und ist, was ich getan habe (ich habe gerade 0 zurückgegeben). Die Art, wie sie formuliert wurde, schien so zu sein, als ob sie die Ordnung wiederherstellen wollte. Ich dachte, ich hätte ein Missverständnis oder vermisste etwas völlig, da es keinen Sinn ergab. Aber die Art und Weise, wie das ursprüngliche Programm strukturiert ist, bevor ich es beende, ist nicht so sehr auf "Wiederherstellung der Reihenfolge". – pudge

0

Abgesehen von einem Klon (kommentiert oben) würde für das Objekt ein eigenes Feld enthalten sein, das die in das Array eingefügte Reihenfolge verfolgt und einen Komparator dafür schreibt.

+0

Ja leider sind beide nicht erlaubt in meiner Umstand. Ich denke, es ist nur ein Platzhalter, so dass die Methode aufgerufen werden kann, da erwartet wird, dass ein Komparator übergeben wird. Es kann nichts anderes sein. – pudge

+0

dann steckst du wahrscheinlich mit dem Klonen der ursprünglichen Sammlung fest –