Sono sconcertato dal fatto che non riesco a trovare una risposta rapida a questo. Sto essenzialmente cercando una struttura dati in Java che implementa l' java.util.List
interfaccia, ma che memorizza i suoi membri in un ordine ordinato. So che puoi usare un normale ArrayList
e usarlo Collections.sort()
, ma ho uno scenario in cui occasionalmente aggiungo e spesso recupero membri dal mio elenco e non voglio doverlo ordinare ogni volta che recupero un membro nel caso in cui un ne è stato aggiunto uno nuovo. Qualcuno può indicarmi una cosa del genere che esiste nel JDK o anche nelle librerie di terze parti?
EDIT : La struttura dei dati dovrà conservare i duplicati.
SOMMARIO DELLA RISPOSTA : Ho trovato tutto questo molto interessante e ho imparato molto. Aioobe in particolare merita una menzione per la sua perseveranza nel cercare di soddisfare i miei requisiti sopra (principalmente un'implementazione java.util.List ordinata che supporta i duplicati). Ho accettato la sua risposta come la più accurata per ciò che ho chiesto e la maggior parte del pensiero mi ha provocato le implicazioni di ciò che stavo cercando anche se ciò che ho chiesto non era esattamente ciò di cui avevo bisogno.
Il problema con ciò che ho chiesto risiede nell'interfaccia List stessa e nel concetto di metodi opzionali in un'interfaccia. Per citare il javadoc:
L'utente di questa interfaccia ha un controllo preciso sulla posizione in cui viene inserito ciascun elemento nell'elenco.
L'inserimento in un elenco ordinato non ha un controllo preciso sul punto di inserimento. Quindi, devi pensare a come gestirai alcuni metodi. Prendiamo add
ad esempio:
public boolean add (Object o)
Appends the specified element to the end of this list (optional operation).
Ora ti trovi nella scomoda situazione di 1) Rompere il contratto e implementare una versione ordinata di add 2) Lasciando add
aggiungere un elemento alla fine della lista, rompendo il tuo ordine 3) Tralasciando add
(come opzionale) lanciando un UnsupportedOperationException
ed attuare un altro metodo che aggiunge elementi in un modo ordinato.
L'opzione 3 è probabilmente la migliore, ma trovo sgradevole avere un metodo di aggiunta che non puoi usare e un altro metodo ordinato che non è nell'interfaccia.
Altre soluzioni correlate (in nessun ordine particolare):
- java.util.PriorityQueue che è probabilmente il più vicino a ciò di cui avevo bisogno rispetto a quello che ho chiesto. Una coda non è la definizione più precisa di una raccolta di oggetti nel mio caso, ma funzionalmente fa tutto ciò di cui ho bisogno.
- net.sourceforge.nite.util.SortedList . Tuttavia, questa implementazione rompe il contratto dell'interfaccia List implementando l'ordinamento nel
add(Object obj)
metodo e stranamente non ha un metodo di effetto peradd(int index, Object obj)
. Il consenso generale suggerisce chethrow new UnsupportedOperationException()
potrebbe essere una scelta migliore in questo scenario. - TreeMultiSet di Guava Un'implementazione dell'insieme che supporta i duplicati
- ca.odell.glazedlists.SortedList Questa classe viene fornita con l'avvertenza nel suo javadoc:
Warning: This class breaks the contract required by List