Estoy desconcertado de no poder encontrar una respuesta rápida a esto. Básicamente, estoy buscando una estructura de datos en Java que implemente la java.util.List
interfaz, pero que almacene sus miembros en un orden ordenado. Sé que puede usar un normal ArrayList
y usarlo Collections.sort()
en él, pero tengo un escenario en el que ocasionalmente agrego y, a menudo, recupero miembros de mi lista y no quiero tener que ordenarlo cada vez que recupero un miembro en caso de que se ha agregado uno nuevo. ¿Alguien puede señalarme algo así que existe en el JDK o incluso en bibliotecas de terceros?
EDITAR : La estructura de datos deberá conservar los duplicados.
RESUMEN DE RESPUESTA : Todo esto me pareció muy interesante y aprendí mucho. Aioobe, en particular, merece una mención por su perseverancia en tratar de lograr mis requisitos anteriores (principalmente una implementación java.util.List ordenada que admite duplicados). He aceptado su respuesta como la más precisa para lo que pregunté y la más estimulante sobre las implicaciones de lo que estaba buscando, incluso si lo que pregunté no era exactamente lo que necesitaba.
El problema con lo que pedí radica en la interfaz List en sí y el concepto de métodos opcionales en una interfaz. Para citar el javadoc:
El usuario de esta interfaz tiene un control preciso sobre en qué lugar de la lista se inserta cada elemento.
Insertar en una lista ordenada no tiene un control preciso sobre el punto de inserción. Luego, debes pensar cómo manejarás algunos de los métodos. Tomemos add
por ejemplo:
public boolean add (Objeto o)
Appends the specified element to the end of this list (optional operation).
Ahora se encuentra en la incómoda situación de 1) Romper el contrato e implementar una versión ordenada de agregar 2) Dejar que add
agregue un elemento al final de la lista, rompiendo su orden ordenado 3) Salir add
(como opcional) tirando an UnsupportedOperationException
e implementando otro método que agrega elementos en un orden ordenado.
La opción 3 es probablemente la mejor, pero me resulta desagradable tener un método de adición que no puede usar y otro método sortedAdd que no está en la interfaz.
Otras soluciones relacionadas (sin ningún orden en particular):
- java.util.PriorityQueue, que probablemente esté más cerca de lo que necesitaba que de lo que pedí. Una cola no es la definición más precisa de una colección de objetos en mi caso, pero funcionalmente hace todo lo que necesito.
- net.sourceforge.nite.util.SortedList . Sin embargo, esta implementación rompe el contrato de la interfaz List al implementar la clasificación en el
add(Object obj)
método y, curiosamente, no tiene ningún efecto paraadd(int index, Object obj)
. El consenso general sugiere quethrow new UnsupportedOperationException()
podría ser una mejor opción en este escenario. - TreeMultiSet de Guava Una implementación de conjunto que admite duplicados
- ca.odell.glazedlists.SortedList Esta clase viene con la advertencia en su javadoc:
Warning: This class breaks the contract required by List