Nehmen wir an, ich habe eine Sammlung von Objekten, die mit einer Reihe von verschiedenen Komparatoren auf der Grundlage der verschiedenen Felder des Objekts sortiert werden können. I
Antworten
Zu viele Anzeigen?Nein, das ist bei den Implementierungen nicht der Fall. Sie müssten es selbst verfolgen. Sie könnten eine Unterklasse einer Collection-Implementierung erstellen, um Felder hinzuzufügen, die diese Informationen enthalten.
Sie könnten die Implementierungen auch mit einer Map auf Metadaten abbilden, wie Sie möchten - insbesondere scheint es, dass Sie dies mit IdentityHashMap tun möchten, da Sie nicht zwei verschiedene Sammlungen als Schlüssel mit equals() auf Gleichheit verglichen werden sollen.
Ich würde einen Booleschen Wert (aufsteigend/absteigend) und einen Verweis auf den Comparator speichern, der für die Sortierung verwendet wird, wenn die Sortierung dadurch vollständig bestimmt wird. Oder wenn es nach Feld sortiert ist, speichern Sie einen String, der das Feld vielleicht benennt.
Sicher:
Definieren Sie Methoden für Ihre dekorierten Collection<Foo>
public List<Comparator<Foo>> getComparators() { ... }
et
public int whichComparator() { ... }
die zurückgibt, welche Comparator
wird derzeit von der List
. Sie können es mit einer ausgefalleneren Map
und einige sinnvolle Schlüssel (z. B. Enums - vielleicht sogar Enums, die die Komparatoren implementieren), wenn Sie ändern, welche Komparatoren während der Lebensdauer des Objekts verwendet werden könnten, aber ich denke, das oben genannte ist ein guter Anfang.