Ich bin verblüfft, dass ich darauf keine schnelle Antwort finden kann. Ich suche im Wesentlichen nach einer Datenstruktur in Java, die die java.util.List
Schnittstelle implementiert , aber ihre Mitglieder in einer sortierten Reihenfolge speichert. Ich weiß, dass Sie ein normales verwenden ArrayList
und es verwenden Collections.sort()
können, aber ich habe ein Szenario, in dem ich gelegentlich Mitglieder zu meiner Liste hinzufüge und diese häufig abrufe, und ich möchte es nicht jedes Mal sortieren müssen, wenn ich ein Mitglied abrufe, falls a neue wurde hinzugefügt. Kann mich jemand auf so etwas hinweisen, das im JDK oder sogar in Bibliotheken von Drittanbietern existiert?
EDIT : Die Datenstruktur müssen Duplikate bewahren.
ANTWORT ZUSAMMENFASSUNG : Ich fand das alles sehr interessant und habe viel gelernt. Insbesondere Aioobe verdient Erwähnung für seine Beharrlichkeit bei dem Versuch, meine oben genannten Anforderungen zu erfüllen (hauptsächlich eine sortierte Implementierung von java.util.List, die Duplikate unterstützt). Ich habe seine Antwort als die genaueste für das akzeptiert, was ich gefragt habe, und am meisten zum Nachdenken über die Auswirkungen dessen, wonach ich gesucht habe, auch wenn das, was ich gefragt habe, nicht genau das war, was ich brauchte.
Das Problem mit dem, wonach ich gefragt habe, liegt in der List-Schnittstelle selbst und dem Konzept optionaler Methoden in einer Schnittstelle. Um den Javadoc zu zitieren:
Der Benutzer dieser Schnittstelle hat eine genaue Kontrolle darüber, wo in der Liste jedes Element eingefügt wird.
Das Einfügen in eine sortierte Liste hat keine genaue Kontrolle über die Einfügemarke. Dann müssen Sie sich überlegen, wie Sie mit einigen Methoden umgehen werden. Nehmen Sie add
zum Beispiel:
public boolean add (Objekt o)
Appends the specified element to the end of this list (optional operation).
Sie befinden sich jetzt in der unangenehmen Situation, entweder 1) den Vertrag zu brechen und eine sortierte Version von add zu implementieren. 2) add
ein Element am Ende der Liste hinzufügen zu lassen, Ihre sortierte Reihenfolge zu brechen. 3 add
) durch Werfen auszulassen (optional) ein UnsupportedOperationException
und ein anderes Verfahren implementiert , welche Elemente in einer sortierten Reihenfolge hinzufügt.
Option 3 ist wahrscheinlich die beste, aber ich finde es unappetitlich, eine Add-Methode zu haben, die Sie nicht verwenden können, und eine andere sortierte Add-Methode, die nicht in der Benutzeroberfläche enthalten ist.
Andere verwandte Lösungen (in keiner bestimmten Reihenfolge):
- java.util.PriorityQueue, die wahrscheinlich dem am nächsten kommt, was ich brauchte, als das, wonach ich gefragt habe. Eine Warteschlange ist in meinem Fall nicht die genaueste Definition einer Sammlung von Objekten, aber funktional macht sie alles, was ich brauche.
- net.sourceforge.nite.util.SortedList . Diese Implementierung bricht jedoch den Vertrag der List-Schnittstelle, indem sie die Sortierung in der
add(Object obj)
Methode implementiert , und hat bizarrerweise eine Methode ohne Auswirkung füradd(int index, Object obj)
. Allgemeiner Konsens legt nahe,throw new UnsupportedOperationException()
dass in diesem Szenario eine bessere Wahl sein könnte. - Guavas TreeMultiSet Eine Set-Implementierung, die Duplikate unterstützt
- ca.odell.glazedlists.SortedList Diese Klasse enthält die Einschränkung in ihrem Javadoc:
Warning: This class breaks the contract required by List