Gibt es in Java eine List
Implementierung, die die Reihenfolge basierend auf der bereitgestellten Comparator
verwaltet?Listenimplementierung, die die Bestellung beibehält
Etwas, das in der folgenden Art und Weise verwendet werden kann:
Comparator<T> cmp = new MyComparator<T>();
List<T> l = new OrderedList<T>(cmp);
l.add(someT);
so dass someT
wird so eingesetzt, dass die Reihenfolge in der Liste beibehalten wird nach cmp
(On @andersoj Vorschlag, den ich bin Abschluss meine Frage mit einer weiteren Anfrage)
Auch ich möchte in der Lage sein, die Liste in sortierter Reihenfolge durchlaufen, ohne die Elemente zu entfernen, dh:
T min = Const.SMALLEST_T;
for (T e: l) {
assertTrue(cmp.compare(min, e) >= 0);
min = e;
}
sollte übergeben werden.
Alle Vorschläge sind willkommen (außer mir zu sagen, Collections.sort
auf der ungeordneten vollständige Liste zu verwenden), aber ich würde etwas in java.*
oder schließlich org.apache.*
bevorzugen, da es schwierig sein würde, neue Bibliotheken zu diesem Zeitpunkt einzuführen.
Anmerkung: (Update4) Ich erkannte, dass Implementierungen dieser Art von Liste unzureichende Leistung haben würde. Es zwei allgemeine Ansätze:
- Verwenden verknüpfte Struktur (Art von) B-Baum oder ähnliche
- Verwenden Array und Insertion (mit Binärsuche)
No 1. hat Problem mit CPU Cache-Misses Nein 2. hat Probleme mit dem Verschieben von Elementen im Array.
UPDATE2: TreeSet
funktioniert nicht, weil sie den vorgesehenen Komparator (MyComparator
) verwendet für die Gleichstellung zu überprüfen und basierend darauf setzt voraus, dass die Elemente gleich sind und sie auszuschließen. Ich brauche diesen Komparator nur für die Bestellung, nicht „Einzigartigkeit“ Filterung (da die Elemente durch ihre natürliche Ordnung nicht gleich sind)
UPDATE3: PriorityQueue
nicht als List
funktioniert (wie ich brauche), weil es Es gibt keine Möglichkeit, sie in der Reihenfolge zu durchlaufen, in der sie "sortiert" ist. Um die Elemente in der sortierten Reihenfolge zu erhalten, müssen Sie sie aus der Sammlung entfernen.
UPDATE:
ähnliche Frage:
A good Sorted List for Java
Sorted array list in Java
Dieses Verhalten würde gegen den 'List'-Vertrag verstoßen und wäre im Allgemeinen eine schlechte Idee. (Guava hat solche Merkmale berücksichtigt und abgelehnt.) –
Welcher Teil des "List" -Vertrags würde verletzt? –
Die Spezifikation für 'add (E)' sagt "Hängt das angegebene Element an das Ende dieser Liste an." Das Hinzufügen an anderer Stelle in der Liste verletzt den Vertrag. –