Mapa ordenado de Java

Resuelto Whatsit asked hace 15 años • 10 respuestas

¿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);
}
Whatsit avatar Mar 20 '09 01:03 Whatsit
Aceptado

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 ascendente
  • values()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.

dmeister avatar Mar 19 '2009 18:03 dmeister

¿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.

John Feminella avatar Mar 19 '2009 18:03 John Feminella

LinkedHashMapMantiene el orden de las claves.

java.util.LinkedHashMapDe lo contrario , parece funcionar como de costumbre HashMap.

VoNWooDSoN avatar Jan 05 '2015 22:01 VoNWooDSoN

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 Mapimplementaciones incluidas con Java 11.

La NavigableMapinterfaz es la sucesora de SortedMap. Lógicamente , se SortedMapdebe 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 compareToel método de Comparable( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html ) interfaz) o mediante una Comparatorimplementación que usted pase. La diferencia entre estas dos clases es que la segunda, ConcurrentSkipListMapes segura para subprocesos y altamente concurrente .

Consulte también la columna Orden de iteración en la siguiente tabla.

  • La LinkedHashMapclase devuelve sus entradas en el orden en que fueron insertadas originalmente .
  • EnumMapdevuelve 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 la DayOfWeekclase 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.

Tabla de implementaciones de mapas en Java 11, comparando sus características

Basil Bourque avatar Dec 29 '2019 01:12 Basil Bourque