En Java, ¿hay un objeto que actúa como un Mapa para almacenar y acceder a pares clave / valor, pero puede devolver una lista ordenada de claves y una lista ordenada de valores, de modo que las listas clave y de valores estén en el mismo orden?
Entonces, como explicación por código, estoy buscando algo que se comporte como mi OrderedMap ficticio:
OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");
String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();
for(int i = 0; i < keys.size(); i++)
{
Integer key = keys.get(i);
String value = values.get(i);
Assert(om.get(key) == value);
}
java
collections
Que es eso
fuente
fuente
LinkedHashMap
.Respuestas:
La interfaz SortedMap (con la implementación TreeMap ) debería ser tu amiga.
La interfaz tiene los métodos:
keySet()
que devuelve un conjunto de claves en orden ascendentevalues()
que devuelve una colección de todos los valores en el orden ascendente de las claves correspondientesEntonces, esta interfaz cumple exactamente sus requisitos. Sin embargo, las claves deben tener un orden significativo. De lo contrario, puede usar LinkedHashMap donde el orden está determinado por el orden de inserción.
fuente
LinkedHashMap
cuyo orden de iteración es el orden en el que se accedió por última vez a sus entradasLinkedHashMap
, el orden de iteración es el orden de inserción, pero puede usar un constructor diferente para especificar el orden de acceso. docs.oracle.com/javase/8/docs/api/java/util/…Estás buscando java.util.LinkedHashMap . Obtendrá una lista de pares Map.Entry <K, V> , que siempre se iteran en el mismo orden. Ese orden es el mismo por el que coloca los elementos. Alternativamente, use java.util.SortedMap , donde las claves deben tener un orden natural o tenerlo especificado por a
Comparator
.fuente
keySet()
vuelva a verificar esto, porque es difícil de verificar mediante pruebas, el método devuelve efectivamente un LinkedHashSet que refleja el orden de susput()
llamadas. Tenga en cuenta que las llamadas repetidas aput()
la misma clave no cambiarán el orden a menos que ustedremove()
la clave de antemano.LinkedHashMap
cuyo orden de iteración es el orden en el que se accedió por última vez a sus entradasLinkedHashMap mantiene el orden de las claves.
java.util.LinkedHashMap parece funcionar como un HashMap normal de lo contrario.
fuente
Creo que la colección más cercana que obtendrás del framework es SortedMap
fuente
Puede aprovechar la interfaz NavigableMap a la que se puede acceder y atravesar en orden ascendente o descendente. Esta interfaz está diseñada para reemplazar la interfaz SortedMap. El mapa navegable generalmente se ordena de acuerdo con el orden natural de sus teclas, o por un comparador proporcionado en el momento de la creación del mapa.
Hay tres mayoría de las implementaciones útiles de la misma: TreeMap , ImmutableSortedMap y ConcurrentSkipListMap .
Ejemplo de TreeMap:
Salida:
fuente
Creo que la interfaz SortedMap hace cumplir lo que pides y TreeMap lo implementa.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/SortedMap.html http://java.sun.com/j2se/1.5.0/docs/api/java/util /TreeMap.html
fuente
Desde Java 6 también existe una alternativa segura y sin bloqueo de subprocesos a TreeMap . Ver ConcurrentSkipListMap .
fuente
tl; dr
Para mantener
Map< Integer , String >
un orden ordenado por clave, use cualquiera de las dos clases que implementan las interfacesSortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Si manipula el mapa dentro de un solo hilo, use el primero
TreeMap
,. Si manipula a través de hilos, use el segundo,ConcurrentSkipListMap
,.Para más detalles, consulte la tabla a continuación y la siguiente discusión.
Detalles
Aquí hay una tabla gráfica que hice mostrando las características de los diez
Map
implementaciones incluidas con Java 11.La
NavigableMap
interfaz es lo queSortedMap
debería haber sido en primer lugar. losSortedMap
lógica debe ser retirado, pero no puede ser tan algunas implementaciones mapa tercera partes pueden estar usando la interfaz.Como puede ver en esta tabla, solo dos clases implementan las interfaces
SortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Ambos mantienen las claves en orden, ya sea por su orden natural (utilizando el
compareTo
método deComparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html ) interfaz) o por unaComparator
implementación que pasa. La diferencia entre estas dos clases es que la segundaConcurrentSkipListMap
es segura para subprocesos , altamente concurrente .Consulte también la columna Orden de iteración en la tabla a continuación.
LinkedHashMap
clase devuelve sus entradas por el orden en que se insertaron originalmente .EnumMap
devuelve entradas en el orden en que se define la clase enum de la clave . Por ejemplo, un mapa de qué empleado cubre qué día de la semana (Map< DayOfWeek , Person >
) usa laDayOfWeek
clase enum integrada en Java. Esa enumeración se define con el lunes primero y el domingo pasado. Entonces las entradas en un iterador aparecerán en ese orden.Las otras seis implementaciones no prometen el orden en que informan sus entradas.
fuente
He usado el mapa Simple Hash, la lista vinculada y las Colecciones para ordenar un Mapa por valores.
El resultado es:
fuente