¿Existe una implementación de List
en Java que mantenga el orden según Comparator
?Implementación de lista que mantiene el pedido
Algo que puede ser utilizado de la siguiente manera:
Comparator<T> cmp = new MyComparator<T>();
List<T> l = new OrderedList<T>(cmp);
l.add(someT);
modo que someT
se inserta de tal manera que el orden de la lista se mantiene de acuerdo a cmp
(En @andersoj sugerencia estoy terminando mi pregunta con una solicitud más)
También quiero poder recorrer la lista en orden ordenado sin eliminar los elementos, es decir:
T min = Const.SMALLEST_T;
for (T e: l) {
assertTrue(cmp.compare(min, e) >= 0);
min = e;
}
debe pasar.
Todas las sugerencias son bienvenidos (excepto diciéndome utilizar Collections.sort
en la lista completa no ordenada), sin embargo, yo preferiría algo en java.*
o eventualmente org.apache.*
ya que sería difícil introducir nuevas bibliotecas en este momento.
Nota: (Update4) me di cuenta de que las implementaciones de este tipo de lista tendrían un desempeño inadecuado. Hay dos enfoques generales:
- Uso estructura Vinculado (tipo de) B-árbol o similares
- Uso matriz y la inserción (con búsqueda binaria)
No 1. tiene un problema con los errores de caché de la CPU No 2. tiene problemas con el desplazamiento de elementos en el conjunto.
Update2: TreeSet
no funciona porque utiliza el comparador proporcionado (MyComparator
) para comprobar la igualdad y en base a que asume que los elementos son iguales y no ellos. Necesito que comparador sólo para pedidos, no filtrado "singularidad" (ya que los elementos por su orden natural no son iguales)
Update3: PriorityQueue
no funciona como List
(ya que necesito) porque no hay no hay forma de recorrerlo en el orden en que está "ordenado", para obtener los elementos en el orden ordenado, debe eliminarlos de la colección.
ACTUALIZACIÓN:
Pregunta similar:
A good Sorted List for Java
Sorted array list in Java
Este comportamiento violaría el contrato 'List' y, en general, sería una mala idea. (Guava ha considerado, y rechazado, tales características.) –
¿Qué parte del contrato 'List' sería violada? –
La especificación para 'add (E)' dice "Agrega el elemento especificado al final de esta lista". Agregarlo a cualquier otro lugar en la lista viola el contrato. –