Soy un principiante en Java. Sugiera qué colección (es) pueden / deben usarse para mantener una lista ordenada en Java. Lo intenté Map
y Set
, pero no eran lo que estaba buscando.
fuente
Soy un principiante en Java. Sugiera qué colección (es) pueden / deben usarse para mantener una lista ordenada en Java. Lo intenté Map
y Set
, pero no eran lo que estaba buscando.
Esto llega muy tarde, pero hay una clase en el JDK solo con el fin de tener una lista ordenada. Se llama (algo fuera de orden con las otras Sorted*
interfaces) " java.util.PriorityQueue
". Puede ordenar Comparable<?>
s o usar unComparator
.
La diferencia con un List
uso ordenado Collections.sort(...)
es que esto mantendrá un orden parcial en todo momento, con un rendimiento de inserción O (log (n)), mediante el uso de una estructura de datos de almacenamiento dinámico, mientras que la inserción en un ordenado ArrayList
será O (n) (es decir, usando búsqueda y movimiento binarios).
Sin embargo, a diferencia de a List
, PriorityQueue
no admite el acceso indexado ( get(5)
), la única forma de acceder a los elementos en un montón es eliminarlos, uno a la vez (de ahí el nombre PriorityQueue
).
TreeMap y TreeSet le darán una iteración sobre los contenidos en orden ordenado. O puede usar una ArrayList y usar Collections.sort () para ordenarla. Todas esas clases están en java.util
fuente
Si desea mantener una lista ordenada que modificará con frecuencia (es decir, una estructura que, además de estar ordenada, permite duplicados y cuyos elementos pueden ser referenciados eficientemente por índice), utilice una ArrayList pero cuando necesite insertar un elemento , use siempre Collections.binarySearch () para determinar el índice en el que agrega un elemento determinado. El último método le indica el índice en el que debe insertar para mantener su lista ordenada.
fuente
Utilice la clase TreeMultiset de Google Guava . La guayaba tiene una espectacular colección de API.
Un problema al proporcionar una implementación de List que mantiene el orden ordenado es la promesa hecha en los JavaDocs del
add()
método.fuente
List
siempre se agrega al final.Desea las implementaciones de SortedSet , es decir, TreeSet .
fuente
Hay algunas opciones Sugeriría TreeSet si no desea duplicados y los objetos que está insertando son comparables.
También puede usar los métodos estáticos de la clase Colecciones para hacer esto.
Consulte Colecciones # sort (java.util.List) y TreeSet para obtener más información.
fuente
Si solo desea ordenar una lista, use cualquier tipo de Lista y use Collections.sort () . Si desea asegurarse de que los elementos de la lista sean únicos y estén siempre ordenados, use un SortedSet .
fuente
Lo que he hecho es implementar List con una instancia interna con todos los métodos delegados.
Después, he implementado un nuevo método "putOrdered" que se inserta en la posición correcta si el elemento no existe o se reemplaza solo en caso de que exista.
Si desea permitir elementos repetidos, simplemente implemente addOrdered en su lugar (o ambos).
Si desea evitar las inserciones, también puede lanzar una excepción de operación no admitida en los métodos "agregar" y "establecer".
... y también debe tener cuidado con los métodos ListIterator porque podrían modificar su lista interna. En este caso, puede devolver una copia de la lista interna o volver a lanzar una excepción.
fuente
List
contrato. Quizás sería mejor implementar soloCollection
. Y siContactList
se ordena, secontains()
puede implementar utilizandobinarySearch
también para ser más eficiente.La forma más eficiente de implementar una lista ordenada como desee sería implementar una lista de salto indexable como aquí: Wikipedia: Lista de salto indexable . Permitiría tener inserciones / eliminaciones en O (log (n)) y permitiría tener acceso indexado al mismo tiempo. Y también permitiría duplicados.
Skiplist es una estructura de datos bastante interesante y, diría yo, subestimada. Desafortunadamente, no hay una implementación de listas de salto indexadas en la biblioteca base de Java, pero puede usar una de las implementaciones de código abierto o implementarla usted mismo. Hay implementaciones regulares de Skiplist como ConcurrentSkipListSet y ConcurrentSkipListMap
fuente
TreeSet no funcionaría porque no permiten duplicados y además no proporcionan un método para recuperar elementos en una posición específica. PriorityQueue no funcionaría porque no permite buscar elementos en una posición específica, que es un requisito básico para una lista. Creo que necesita implementar su propio algoritmo para mantener una lista ordenada en Java con tiempo de inserción O (logn), a menos que no necesite duplicados. Tal vez una solución podría ser usar un TreeMap donde la clave es una subclase del elemento que anula el método igual para que se permitan duplicados.
fuente
Usando LambdaJ
Puede intentar resolver estas tareas con LambdaJ si está utilizando versiones anteriores de Java 8. Puede encontrarlo aquí: http://code.google.com/p/lambdaj/
Aquí tienes un ejemplo:
Ordenar iterativo
Ordenar con LambdaJ
Por supuesto, tener este tipo de belleza impacta en el rendimiento (un promedio de 2 veces), pero ¿puedes encontrar un código más legible?
Ordenar con java 8 usando la expresión lambda
fuente
-(p1.getAge().compareTo(p2.getAge()))
El problema con PriorityQueue es que está respaldado por una matriz simple, y la lógica que pone los elementos en orden se realiza mediante la cosa "cola [2 * n + 1] y cola [2 * (n + 1)]". Funciona muy bien si solo tira de la cabeza, pero lo hace inútil si está tratando de llamar al .toArray en algún momento.
Evito este problema usando com.google.common.collect.TreeMultimap, pero proporciono un comparador personalizado para los valores, envuelto en un pedido, que nunca devuelve 0.
ex. para doble:
De esta manera obtengo los valores en orden cuando llamo .toArray (), y también tengo duplicados.
fuente
Lo que quieres es un árbol de búsqueda binario. Mantiene el orden ordenado al tiempo que ofrece acceso logarítmico para búsquedas, eliminaciones e inserciones (a menos que tenga un árbol degenerado, entonces es lineal). Es bastante fácil de implementar e incluso puede hacer que implemente la interfaz de Lista, pero luego el acceso al índice se complica.
El segundo enfoque es tener una ArrayList y luego una implementación de clasificación de burbujas. Debido a que está insertando o eliminando un elemento a la vez, los tiempos de acceso para inserciones y eliminaciones son lineales. Las búsquedas son logarítmicas y el acceso al índice es constante (los tiempos pueden ser diferentes para LinkedList). El único código que necesita es 5, quizás 6 líneas de burbuja.
fuente
Puede usar Arraylist y Treemap, ya que dijo que también desea valores repetidos, luego no puede usar TreeSet, aunque también está ordenado, pero debe definir el comparador.
fuente
Para Set puedes usar TreeSet. TreeSet ordena sus elementos sobre la base de un orden natural o cualquier orden de clasificación pasado al Comparable para ese objeto en particular. Para el mapa use TreeMap. TreeMap proporciona la clasificación por claves. Para agregar un objeto como clave al TreeMap, esa clase debe implementar una interfaz comparable que a su vez obliga a implementar el método compare to () que contiene la definición del orden de clasificación. http://techmastertutorial.in/java-collection-impl.html
fuente
Use el método sort () para ordenar la lista de la siguiente manera:
Para referencia, consulte el enlace: http://tutorials.jenkov.com/java-collections/sorting.html
fuente
Uso
TreeSet
que da elementos en orden ordenado. O useCollection.sort()
para la ordenación externa conComparator()
.fuente
fuente
con Java 8 Comparator, si queremos ordenar la lista, aquí están las 10 ciudades más pobladas del mundo y queremos ordenarla por nombre, según lo informado por Time. Osaka, Japón. ... Ciudad de México, México. ... Beijing, China. ... São Paulo, Brasil. ... Mumbai, India. ... Shanghai, China. ... Delhi, India. ... Tokio, Japón.
fuente
Ordenar una ArrayList de acuerdo con los criterios definidos por el usuario.
Clase de modelo
Clase de clasificación
Clase principal
Salida
fuente