Mapa ordenado de Java
¿Existe un objeto en Java que actúa como un mapa para almacenar y acceder a pares clave/valor, pero que puede devolver una lista ordenada de claves y una lista ordenada de valores, de modo que las listas de claves y 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);
}
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 orden ascendente de las claves correspondientes
Esta interfaz satisface exactamente sus necesidades. Sin embargo, las claves deben tener un orden significativo. De lo contrario, puede utilizar LinkedHashMap donde el orden está determinado por el orden de inserción.
¿Existe un objeto que actúa como un mapa para almacenar y acceder a pares clave/valor, pero que puede devolver una lista ordenada de claves y una lista ordenada de valores, de modo que las listas de claves y valores estén en el mismo orden?
Estás buscando java.util.LinkedHashMap . Obtendrá una lista de pares Map.Entry<K,V> , que siempre se repiten en el mismo orden. Ese orden es el mismo que el orden en el que coloca los elementos. Alternativamente, use java.util.SortedMap , donde las claves deben tener un orden natural o especificarlo mediante un archivo Comparator
.
LinkedHashMap
Mantiene el orden de las claves.
java.util.LinkedHashMap
De lo contrario , parece funcionar como de costumbre HashMap
.
tl; dr
Para mantener Map< Integer , String >
un orden ordenado por clave, use cualquiera de las dos clases que implementan las interfaces SortedMap
/ :NavigableMap
TreeMap
ConcurrentSkipListMap
…o implementaciones de terceros. Quizás en las colecciones de Google Guava o Eclipse (no lo he comprobado).
Si manipula el mapa dentro de un solo hilo, use el primero, TreeMap
. Si manipula entre subprocesos, utilice el segundo, ConcurrentSkipListMap
.
Para obtener más información, consulte la siguiente tabla y la siguiente discusión.
Detalles
Aquí hay una tabla gráfica que hice que muestra las características de las diez Map
implementaciones incluidas con Java 11.
La NavigableMap
interfaz es la sucesora de SortedMap
. Lógicamente , se SortedMap
debe eliminar, pero no se puede, ya que algunas implementaciones de mapas de terceros pueden estar usando una 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 (usando compareTo
el método de Comparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html ) interfaz) o mediante una Comparator
implementación que usted pase. La diferencia entre estas dos clases es que la segunda, ConcurrentSkipListMap
es segura para subprocesos y altamente concurrente .
Consulte también la columna Orden de iteración en la siguiente tabla.
- La
LinkedHashMap
clase devuelve sus entradas en el orden en que fueron insertadas originalmente . EnumMap
devuelve entradas en el orden en que se define la clase de enumeración de la clave . Por ejemplo, un mapa de qué empleado cubre qué día de la semana (Map< DayOfWeek , Person >
) utiliza laDayOfWeek
clase enum integrada en Java. Esa enumeración se define con el lunes primero y el domingo último. Entonces las entradas en un iterador aparecerán en ese orden.
Las otras seis implementaciones no prometen el orden en el que informarán sus entradas.