Wie sortieren?

jf

Bekanntes Mitglied
Hallo, ich habe eine Klasse, welche die Klasse Vector<AbstractObj> erweitert.
Ich lege nun in dieser Klasse verschiedene Objekte ab (grob chronologisch), welche alle von AbstractObj erben. Alle diese verschiedenen Objekte besitzen einen Zeitstempel.
Nun möchte ich diesen Vector sortieren, damit eine streng chronologische Ordnung entsteht.

Dazu habe ich nun folgende Fragen:
- Welcher Sortieralgorithmus ist am geeignetsten (schnellsten) - es herrscht in der Regel eine gute Vorsortierung
- Ich würde gerne comparable implementieren. Kann ich dies in der abstrakten Klasse tun, oder muss diese in jeder Klasse, welche davon erbt einzeln erfolgen (wäre Mist, da x-mal der gleiche Code).
- Wäre es evtl. geschickter, anstatt eines Vectors eine andere sortierbare Klasse zu verwenden? (liege ich richtig, wenn ich sage, dass Vector threadsicher ist, aber List und ArrayList nicht?)

Besten Dank für eure Tipps! :)
 

Landei

Top Contributor
Wenn nur der Zeitstempel für die Sortierung relevant ist, würde ich das Comparable-Interface in der abstrakten Klasse implementieren. Allerdings wäre ich da vorsichtig, bei gleichem Zeitstempel wäre die Reihenfolge undefiniert (eventuell könnte man noch Klassennamen und hashCode mit einbeziehen, um das zu vermeiden). equals und hashCode solltest du auch implementieren, und zwar "regelkonform".

Statt Vector würde ich eine ArrayList nehmen. Wenn du diese wirklich einmal threadsicher brauchst, kannst du immer noch einen synchronisierten Wrapper mit java.util.Collections erzeugen.

Natürlich sollte man generell eine Collection-Klasse nur erweitern, wenn man ihr Funktionalität aus "Collection-Sicht" hinzufügt (z.B. dass man einen PropertyChangeListener registrieren kann wenn sich etwas ändert), aber nicht, um "modellspezifische" Probleme zu lösen - dann ist Komposition die bessere Wahl.

Ich denke kaum, dass irgendeine eigene Implementierung den Sortieralgorithmus in Collection.sort schlagen kann, das ist ein wirklich ausgefeiltes Timsort (es sei denn, man hat zusätzliches Wissen über die Daten, z.B. dass es sehr wenige mögliche Werte gibt, wo Bucketsort und Konsorten besser abschneiden würden).
 
Zuletzt bearbeitet:

tfa

Top Contributor
Vector ist veraltet. Ich benutze lieber ArrayList bzw. eine andere List-implementierende Klasse.
Ist es nötig, eine Unterklasse von Vector (oder was auch immer) zu bilden? Lass deine Klasse doch nur eine List<AbstractObj> benutzen, also Komposition statt Vererbung. Normalerweise fährt man damit besser.

- Welcher Sortieralgorithmus ist am geeignetsten (schnellsten) - es herrscht in der Regel eine gute Vorsortierung
Benutze einfach den in Collections.sort() implementierten. Das ist ein Merge-Sort und sollte schnell genug sein.

- Ich würde gerne comparable implementieren. Kann ich dies in der abstrakten Klasse tun, oder muss diese in jeder Klasse, welche davon erbt einzeln erfolgen (wäre Mist, da x-mal der gleiche Code).
Dann musst du es wohl in der abstrakten Klasse implementieren.
Du kannst auch selbst Comparatoren schreiben, falls du die selben Objekte nach verschiedenen Kriterien sortieren willst.

- Wäre es evtl. geschickter, anstatt eines Vectors eine andere sortierbare Klasse zu verwenden? (liege ich richtig, wenn ich sage, dass Vector threadsicher ist, aber List und ArrayList nicht?)
Ja, siehe oben. List ist ein Interface. Oft ist es sinnvoll, gegen Interfaces statt gegen konkrete Implementierungen zu programmieren.
 

jf

Bekanntes Mitglied
Allerdings wäre ich da vorsichtig, bei gleichem Zeitstempel wäre die Reihenfolge undefiniert
Welche Nachteile können daraus entstehen? Sind dadurch nur unterschiedliche Sortierungen für eine bestimmte Auswahl von Elementen möglich, oder funktioniert dadurch die ganze Sortierung nicht korrekt?

equals und hashCode solltest du auch implementieren, und zwar "regelkonform".
Ok, könntest du mir hierzu bitte noch etwas Hintergrundwissen geben?
Und was gibt es zu beachten, um regelkonform zu bleiben? Was sind die Nachteile, wenn man dies nicht einhält?

Statt Vector würde ich eine ArrayList nehmen. Wenn du diese wirklich einmal threadsicher brauchst, kannst du immer noch einen synchronisierten Wrapper mit java.util.Collections erzeugen.
Wie meinst du das genau?

Natürlich sollte man generell eine Collection-Klasse nur erweitern, wenn man ihr Funktionalität aus "Collection-Sicht" hinzufügt (z.B. dass man einen PropertyChangeListener registrieren kann wenn sich etwas ändert), aber nicht, um "modellspezifische" Probleme zu lösen - dann ist Komposition die bessere Wahl.
Ok, ich dachte mir, da meine Klasse ja ein Art von Container ist, dass ich gleich vererbe, um so möglichst viele Collections-Methoden ohne zusätzlichen eignen Kode erhalte.
Ich habe nun aber auch gemerkt, dass man über intellisens eine oft sehr umfangreiche Liste erhält, welche Eclipse auch schon mal eine Weile einfrieren lässt (Warum ist das überhaupt so? Kann man da etwas machen?)... Ist dies der einzige Nachteil?
 

jf

Bekanntes Mitglied
Vector ist veraltet.
Ok, was sind die konkreten Nachteile von Vector?

Ich benutze lieber ArrayList bzw. eine andere List-implementierende Klasse.
Ist das eine subjektive Entscheidung, oder gibt es dafür auch objektive Gründe?

Ist es nötig, eine Unterklasse von Vector (oder was auch immer) zu bilden? Lass deine Klasse doch nur eine List<AbstractObj> benutzen, also Komposition statt Vererbung. Normalerweise fährt man damit besser.
Ok. Habe ja hierzu schon auf Landeis gleiche Empfehlung etwas geschrieben.

Benutze einfach den in Collections.sort() implementierten. Das ist ein Merge-Sort und sollte schnell genug sein.
Mit Java 7 sollte es sogar ein Timsort sein. :)

Du kannst auch selbst Comparatoren schreiben, falls du die selben Objekte nach verschiedenen Kriterien sortieren willst.
Ok, aber eigentlich ist nur die Zeit wichtig.

Ja, siehe oben. List ist ein Interface. Oft ist es sinnvoll, gegen Interfaces statt gegen konkrete Implementierungen zu programmieren.
Wie meinst du das? - Ich will doch nicht gegen etwas programmieren... :D
 

ARadauer

Top Contributor
Ok, was sind die konkreten Nachteile von Vector?
er ist langsamer

Ist das eine subjektive Entscheidung, oder gibt es dafür auch objektive Gründe?
nicht subjektiv, vector ist veraltelt und langsamer

Wie meinst du das? - Ich will doch nicht gegen etwas programmieren... :D
Das ist für einen Anfänger nicht so leicht zu verstehen. Es gibt eine Beschreibung der Schnittstelle (Interface) und konkrete Implementierungen.
List ist das Interface, ArrayList ist eine Implementierung davon.
In seinem Programm arbeitet man haupsächlich mit List, man programmiert also auf/mit/gegen (ka) die Schnittstelle.
Irgendwo in seinem Programm hat man natürlich dan die Instanzierung (new ArrayList()) der Liste. Da benutzt man schon die Konkrete Implementierung (List kann man ja nicht instazieren)
Dadurch wird man flexibler, wenn man an der Stelle an der man die ArrayList instanziert, dann eine andere Implementierung von List nimmt, muss man nicht sein gesamte Programm umschreiben, da ja eh die anderen Methoden nur List erwarten... verstanden? Nein... kann daran liegen, dass du einfach noch zu wenig Erfahrung mit dem Thema hast oder ich schlecht erklären kann :oops:

Was wären so implementierungen von List?
List (Java Platform SE 6)
 

Landei

Top Contributor
Selbst im täglichen Leben "programmieren wir gegen Interfaces". Z.B gibt es keine Flachrundkopfschraube 5x20 (das "Interface"). Was es gibt, sind konkrete Schrauben eines bestimmten Herstellers, die dieser Norm entsprechen (die "Implementierung"). Gehen wir in den Laden, verlangen wir meistens nur "Flachrundkopfschraube 5x20", weil uns völlig egal ist, ob die von Schraubensepp oder Eisengustl hergestellt sind, ob sie gedreht, gegossen oder von fleißigen indischen Kinderhänden aus dem Stück gefeilt worden sind - Hauptsache sie entsprechen der Norm. Mit Listen ist es genauso: Benötigen wir keine ganz speziellen Eigenschaften einer ganz speziellen Implementierung, nehmen wir einfach "List": Damit ist klar, was das Ding können muss, aber nicht, wie es intern aufgebaut ist. Damit sichern wir uns ein Stück Unabhängigkeit: Geht Eisengustl ein, können wir ohne Probleme zu Schraubensepp wechseln, ist Vector zu langsam, können wir ArrayList nehmen.
 

jf

Bekanntes Mitglied
Ok, danke ihr beiden. Das war zwar mehr scherzhaft gemeint, weil ich die Formulierung "gegen" nicht kannte, aber sinnvoll waren eure Erklärungen allemal. :)

ist Vector zu langsam, können wir ArrayList nehmen.
Ok, dann müsste aber Vector eine Implementierung des Interfaces List sein. - Ist es das, wenn es veraltet ist?
Ich habe mal gelesen, dass Vector gar nicht so viel langsamer ist. Könntet ihr den Unterschied in einer Zahl beziffern?
Gibt es threadsichere und moderne Implementierung von List? Wie würde das mit der Wrapper-Klasse laufen, welche du erwähnt hattest Landei?
 
G

Gast2

Gast
Ok, dann müsste aber Vector eine Implementierung des Interfaces List sein. - Ist es das, wenn es veraltet ist?

Ein Blick in die API sagt:
Java:
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

Man kann mit Sicherheit messen wie groß der Unterschied ist - aber wie gesagt: Wenn du einfach mit dem List Interface arbeitest kannst du die konkrete Implementierung einfach austauschen. Dann kannst du es in deinem Use Case selber messen - oder einfach glauben das ArayList schneller ist ;)
 

tfa

Top Contributor
Ok, dann müsste aber Vector eine Implementierung des Interfaces List sein. - Ist es das, wenn es veraltet ist?
Vector ist älter als das List-Interface, bzw. das Collection-Framework.
In der API-Doku zu Vector steht "this class was retrofitted to implement the List interface, making it a member of the Java Collections Framework." Er wurde also nachträglich in das Framework reingefrickelt. Das sieht man heute noch, denn es gibt zwei Methoden, um an die Vector-Elemente zu kommen. Einmal das alte "elementAt()" und dann aus List das neue "get()". Zwei unterschiedliche Methoden die exakt das gleiche machen sind nunmal unschön. Aber Vector gleich als Deprecated zu markieren hat man sich dann doch nicht getraut.
 

jf

Bekanntes Mitglied
Super, vielen Dank an alle!

Bleiben nur noch meine letzten Fragen:
* Gibt es einen modernen Ersatz für Vector, welcher threadsicher ist?
* Wie ist das mit dem Wrapper gemeint?
* Könntet ihr bitte noch einen Kommentar zu equals und hashCode abgeben? Und was bedeutet hier "regelkonform"?
 

Landei

Top Contributor
* Gibt es einen modernen Ersatz für Vector, welcher threadsicher ist?
CopyOnWriteArrayList (Java 2 Platform SE 5.0)

* Wie ist das mit dem Wrapper gemeint?
java.utils.Collections hat verschiedene statische Methoden, die Collections "einpacken", um ihnen zusätzliche Eigenschaften mitzugeben, etwa unmodifiableList (macht eine Liste "read-only") oder synchronizedList (macht eine Liste threadsafe).

Generell ist ein Wrapper eine Klasse, die im Inneren eine Referenz auf ein "Original" besitzt, sich selbst ähnlich wie das Original verhält und die Aufrufe auch an dieses weiterleitet (dabei aber selbt verschiedene Operationen ausführen kann). Andere Sprachen unterstützen solche Konstruktionen direkt ("Delegation"). Ein Beispiel, wo zu einer vorhandenen Klasse Logging-Funktionalität hinzugefügt wird:

Java:
public interface Person {
   public String getName();
   public int getAge();
}

//das "Original"
public class PersonImpl implements Person {
   private final String name;
   private final int age;
   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }
   public String getName() { return name; }
   public int getAge() { return age; }
}

class PersonLogWrapper implements Person {
   private Person original;
   public PersonLogWrapper(Person original) {
       this.original = original;
   }
   public String getName() { 
      Logger.getLogger().log("Jemand will den Namen wissen");
      return original.getName(); 
   }
   public int getAge() { 
      Logger.getLogger().log("Jemand will das Alter wissen");
      return original.getAge(); 
   }
}

* Könntet ihr bitte noch einen Kommentar zu equals und hashCode abgeben? Und was bedeutet hier "regelkonform"?
"Regelkonform" bedeutet hier: Sich an die Javadoc der beiden Methoden halten.
Equals and Hash Code in Java
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 3.7 Identität und Gleichheit
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2 Object ist die Mutter aller Klassen
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
Willi.We Array sortieren Allgemeine Java-Themen 5
L ArrayList sortieren Allgemeine Java-Themen 2
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
C MySQL Tabellen sortieren. Allgemeine Java-Themen 33
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
B Java Mail: Emails sortieren? Allgemeine Java-Themen 5
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
P Wertepaare sortieren Allgemeine Java-Themen 3
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P Listen sortieren Allgemeine Java-Themen 1
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
K Strings sortieren: 2 Kritieren Allgemeine Java-Themen 5
B Algortihmus zum linearen Sortieren Allgemeine Java-Themen 1
K ArrayList sortieren Allgemeine Java-Themen 16
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
B Counting Sort (Sortieren durch Zählen) Allgemeine Java-Themen 13
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
Bluedaishi String Array mit Datum und Uhrzeit String sortieren Allgemeine Java-Themen 6
K Sortieren nach Vorgabe Allgemeine Java-Themen 6
S Erste Schritte Arrayliste alphabetisch sortieren mit Eingabe Allgemeine Java-Themen 9
L Sortieren von "Map<String, Object>" Allgemeine Java-Themen 2
M Sortieren und Leerzeichen Allgemeine Java-Themen 11
W Array Indizes sortieren Allgemeine Java-Themen 16
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
E Array alphabetisch sortieren Allgemeine Java-Themen 1
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
P Beim sortieren nullpointerexception Allgemeine Java-Themen 12
G Map nach key sortieren Allgemeine Java-Themen 14
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
S Int Values sortieren Allgemeine Java-Themen 7
S Sortieren nach Objekten Allgemeine Java-Themen 13
A 2D-array problem (sortieren) Allgemeine Java-Themen 6
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
D priority queue sortieren Allgemeine Java-Themen 10
G List<Person> sortieren Allgemeine Java-Themen 6
K Hashmap sortieren Allgemeine Java-Themen 6
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
M ArrayList<String>, String häufigkeit sortieren Allgemeine Java-Themen 4
T Liste sortieren Allgemeine Java-Themen 6
K Strings sortieren (knifflig) Allgemeine Java-Themen 7
B JTable nach Icon sortieren Allgemeine Java-Themen 6
C ArrayList (mit Objekten) sortieren Allgemeine Java-Themen 12
J Map nach value sortieren Allgemeine Java-Themen 14
N Zahlen in Strings einer ArrayList sortieren Allgemeine Java-Themen 14
V ArrayList sortieren Allgemeine Java-Themen 7
S String-Array nach Datum sortieren Allgemeine Java-Themen 10
Developer_X Ein Array nach einem bestimmten Attribut sortieren Allgemeine Java-Themen 3
B Sortieren mit generischen Datentypen Allgemeine Java-Themen 3
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
O Sortieren von Telefonnummern Allgemeine Java-Themen 8
D JTabel sortieren nach mehreren kriterien Allgemeine Java-Themen 3
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
K ArrayList nach bestimmtem Muster sortieren Allgemeine Java-Themen 3
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
S Koordinatentupel-Map sortieren?? Allgemeine Java-Themen 16
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
G ArrayList mit quicksort sortieren Allgemeine Java-Themen 9
Spot84 Vector nach Ressourcetyp sortieren Allgemeine Java-Themen 4
G sortieren von generics Allgemeine Java-Themen 10
Z Als Final deklarierte Klasse im Array sortieren Allgemeine Java-Themen 2
C ArrayList nach Datum sortieren Allgemeine Java-Themen 7
O ArrayList sortieren Allgemeine Java-Themen 8
G ArrayList mit Indices parallel sortieren Allgemeine Java-Themen 8
D HashMap sortieren Allgemeine Java-Themen 2
C Sortieren File[] Allgemeine Java-Themen 5
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
D LinkedList anhand einer long-Variable der Objekte sortieren Allgemeine Java-Themen 5
O Vektoren in Vektor sortieren aber mit Java 1.4 (!) Allgemeine Java-Themen 4
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
M ArrayList sortieren - HashMap mit sort_id vorhanden Allgemeine Java-Themen 2
A Sortieren mit Java Allgemeine Java-Themen 3
J Properties sortieren Allgemeine Java-Themen 6
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
E Bitte um Rat: Sortieren mit ArrayList Allgemeine Java-Themen 2
G Strings die Zahlen enthalten sinnvoll sortieren (A2 < A10 Allgemeine Java-Themen 4
G List mit selbstdefinierten Objekten sortieren Allgemeine Java-Themen 2
F Doppelt verkettete Liste sortieren? Allgemeine Java-Themen 8
S ArrayList nach mehreren Spalten sortieren? Allgemeine Java-Themen 13
G Set absteigend Sortieren Allgemeine Java-Themen 6
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
D Sortieren? Allgemeine Java-Themen 13
N ArrayList sortieren Allgemeine Java-Themen 10
L Nach Häufigkeit sortieren Allgemeine Java-Themen 6
S Dten im Excel sortieren Allgemeine Java-Themen 5
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
H Objekte Sortieren Allgemeine Java-Themen 4
F Kann man String[] sortieren? Allgemeine Java-Themen 2
H will einfach nicht sortieren! Allgemeine Java-Themen 23
T Collections/Arrays sortieren => ä, ö, ü, ß Groß/klein Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben