Sortierte Array-Liste in Java

Ich bin verblüfft, dass ich darauf keine schnelle Antwort finden kann. Ich bin im Wesentlichen auf der Suche nach einer Datenstruktur in Java, die die @ implementiejava.util.List Interface, das aber seine Mitglieder in einer sortierten Reihenfolge speichert. Ich weiß, dass Sie ein normales @ verwenden könnArrayList und benutzeCollections.sort() darauf, aber ich habe ein Szenario, in dem ich gelegentlich Mitglieder von meiner Liste hinzufüge und häufig abrufe und ich möchte nicht, dass ich sie jedes Mal sortieren muss, wenn ich ein Mitglied abrufe, falls ein neues hinzugefügt wurde. Kann mich jemand auf etwas hinweisen, das im JDK oder in Bibliotheken von Drittanbietern vorhanden ist?

BEARBEITE: Die Datenstruktur muss Duplikate beibehalten.

ANTWORT's SUMMARY: Ich fand das alles sehr interessant und habe viel gelernt. Insbesondere Aioobe verdient Erwähnung für seine Beharrlichkeit bei dem Versuch, meine obigen Anforderungen zu erfüllen (hauptsächlich eine sortierte Implementierung von java.util.List, die Duplikate unterstützt). Ich habe seine Antwort als die zutreffendste für das akzeptiert, wonach ich gefragt habe, und am meisten darüber nachgedacht, was ich gesucht habe, auch wenn das, wonach 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 der optionalen Methoden in einer Schnittstelle. Um das Javadoc zu zitieren:

Der Benutzer dieser Schnittstelle hat die genaue Kontrolle darüber, wo in der Liste jedes Element eingefügt wird.

as Einfügen in eine sortierte Liste hat keine genaue Kontrolle über die Einfügemarke. Dann müssen Sie sich überlegen, wie Sie mit einigen der Methoden umgehen. Nehmenadd zum Beispiel

public boolean add (Objekt o)

 Appends the specified element to the end of this list (optional operation).

Sie befinden sich nun in der unangenehmen Situation, entweder 1) den Vertrag zu brechen und eine sortierte Version von add 2) zu implementiereadd füge ein Element an das Ende der Liste an und brich die sortierte Reihenfolge. 3) Leavingadd out (optional) durch Auslösen einesUnsupportedOperationException und Implementierung einer anderen Methode, die Elemente in einer sortierten Reihenfolge hinzufügt.

Option 3 ist wahrscheinlich die beste, aber ich finde es unangenehm, eine Add-Methode zu haben, die Sie nicht verwenden können, und eine andere SortedAdd-Methode, die nicht in der Benutzeroberfläche enthalten ist.

Andere verwandte Lösungen (in keiner bestimmten Reihenfolge):

java.util.PriorityQueue was 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 dazu brauche. net.sourceforge.nite.util.SortedList. Diese Implementierung unterbricht jedoch den Vertrag der List-Schnittstelle, indem die Sortierung im @ -Zeichen implementiert wiradd(Object obj) Methode und Bizarr hat eine No-Effect-Methode füradd(int index, Object obj). Allgemeiner Konsens legt @ nathrow new UnsupportedOperationException() ist in diesem Szenario möglicherweise die bessere Wahl. Guava's TreeMultiSet Eine Set-Implementierung, die Duplikate unterstützt ca.odell.glazedlists.SortedList Diese Klasse kommt mit dem Vorbehalt in seinem Javadoc:Warning: This class breaks the contract required by List

Antworten auf die Frage(4)

Ihre Antwort auf die Frage