Objekte Sortieren nach xBeliebigem Attribut

Guten Tag,

Wir sollen Objekte nach einem xBeliebigen Attribut sortieren. Eine Aufgabe die erstmal ziemlich einfach klingt, ich aber dennoch Probleme bei der Umsetzung habe:

Ich habe eine Sorter-Klasse (ObjectSorter) ,eine zu sortierende Klasse (SortableObject) und eine Comparator-Klasse (ComparatorObject). Das Programm wird über die Konsole gesteuert und mittels einem Parameter kann man angeben, anhand welchen Attributes sortiert werden sollte.
Die zu sortierenden SortableObject’s sind in einer ArrayList gespeichert.
Sortiert wird mittels Collections.sort und dem ComparatorObject. Das ComparatorObject wird mit dem nötigen Argument initialisiert, nach was sortiert werden soll. in der Klasse selbst gibt es mehrere IF-ELSE Konstrukte in der compare-Methode welche anhand des gesetzten Parameters entscheiden, nach welchem Attribut sortiert werden soll.
Dies funktioniert und ist auch „einigermassen“ schön.
Es ist das Höchstmass an Flexibilität welches ich bis jetzt erreichen konnte. Füge ich z.B. der Klasse SortableObject ein weiteres Attribut hinzu, nach welchem ich danach auch sortieren möchte, muss ich zwangsweise den Comparator auch ändern.
Schön wäre es, einen Zugriff mittels Variable auf Attribute zu haben. Dies ist aber nur realisierbar, wenn ich die Attribute des SortableObject’s in eine Map packe was ich keinesfalls möchte.

Gibt es andere Möglichkeiten um dies in Java zu lösen oder habt ihr villeicht einen komplett anderen Ansatz für diese Problem?

Hallo,

Es ist das Höchstmass an Flexibilität welches ich bis jetzt :erreichen konnte. Füge ich z.B. der Klasse SortableObject ein :weiteres Attribut hinzu, nach welchem ich danach auch sortieren :möchte, muss ich zwangsweise den Comparator auch ändern.

Gibt es andere Möglichkeiten um dies in Java zu lösen oder
habt ihr villeicht einen komplett anderen Ansatz für diese
Problem?

Stichwort Reflection, damit kannst du zur Laufzeit entscheiden, auf welche Objektfelder du zugreifen möchtest : http://java.sun.com/docs/books/tutorial/reflect/memb…

Gruß
Heavy

hmm, die Frage ist bloss, ob dies den Rahmen der Aufgabe sprengt. Mal schauen ob ich morgen noch Zeit dafür finde.

Dankeschön!

Hallo,

Gibt es andere Möglichkeiten um dies in Java zu lösen oder
habt ihr villeicht einen komplett anderen Ansatz für diese
Problem?

Mir fällt dazu das Design-Pattern Visitor ein. Das funktioniert so ähnlich wie dein ComparatorObject. Dazu gibt es eine Visitorklasse (die das VisitorInterace implementiert), die alle interessanten Objekte „Besucht“ und dort eine Aufgabe erledigt(sortieren in deinem Fall).

Konkret müsstest du dann Arralist erweitern (ableiten) sodass es zusätzlich eine Methode accept(T extends Visitor) gibt, die den Visitor annimmt und die visit() methode des Visitors ausführt. die visit() Methode stößt dann die gewünschte Sortierung an.

Der Vorteil ist, das du wenn ein neues Attribut dazu kommt einfach nur einen neuen kleinen Visitor schreiben musst und kein vielleicht großes, komplexes ComparatorObject warten musst.

Es gibt dann beispielsweise einen ageSortVisitor, nameSortVisitor…

und wennst plötzlich draufkommst, du möchtest nach Augenfarbe sortieren, dann schreibst eben einen eyeColorSortVisitor…

näher Informationen:
http://en.wikipedia.org/wiki/Visitor_pattern

lg