ordenado example entre ejemplos diferencia diccionario java collections

example - map string object java



Mapa ordenado de Java (8)

¿Hay un objeto que actúa como un Mapa para almacenar y acceder a los pares clave / valor, pero puede devolver una lista ordenada de claves y una lista ordenada de valores, de modo que la clave y las listas de valores estén en el mismo orden?

Estás buscando java.util.LinkedHashMap . Obtendrá una lista de los Map.Entry<K,V> , que siempre se iteran en el mismo orden. Ese orden es el mismo por el que colocó los elementos. Alternativamente, use java.util.SortedMap , donde las claves deben tener un orden natural o deben tenerlo especificado por un Comparator .

En Java, ¿existe un objeto que actúe como un Mapa para almacenar y acceder a pares clave / valor, pero que pueda 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); }


Creo que la colección más cercana que obtendrás del framework es SortedMap




He utilizado el mapa de hash simple, la lista enlazada y las colecciones para ordenar un mapa por valores.

import java.util.*; import java.util.Map.*; public class Solution { public static void main(String[] args) { // create a simple hash map and insert some key-value pairs into it Map<String, Integer> map = new HashMap<String, Integer>(); map.put("Python", 3); map.put("C", 0); map.put("JavaScript", 4); map.put("C++", 1); map.put("Golang", 5); map.put("Java", 2); // Create a linked list from the above map entries List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet()); // sort the linked list using Collections.sort() Collections.sort(list, new Comparator<Entry<String, Integer>>(){ @Override public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) { return m1.getValue().compareTo(m2.getValue()); } }); for(Entry<String, Integer> value: list) { System.out.println(value); } } }

La salida es:

C=0 C++=1 Java=2 Python=3 JavaScript=4 Golang=5


La interfaz de SortedMap (con la implementación TreeMap ) debe ser su amigo.

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

Así que esta interfaz cumple exactamente sus requisitos. Sin embargo, las claves deben tener un orden significativo. De lo contrario, puede usar el LinkedHashMap donde el orden está determinado por el orden de inserción.


LinkedHashMap mantiene el orden de las claves.

java.util.LinkedHashMap parece funcionar de la misma manera que un HashMap normal.


Puede aprovechar la interfaz NavigableMap que se puede acceder y atravesar en orden ascendente o descendente. Esta interfaz está destinada a reemplazar la interfaz SortedMap. El mapa Navegable generalmente se ordena según el orden natural de sus claves, o por un Comparador proporcionado en el momento de la creación del mapa.

Hay tres implementaciones más útiles: TreeMap , TreeMap y ConcurrentSkipListMap .

Ejemplo de TreeMap:

TreeMap<String, Integer> users = new TreeMap<String, Integer>(); users.put("Bob", 1); users.put("Alice", 2); users.put("John", 3); for (String key: users.keySet()) { System.out.println(key + " (ID = "+ users.get(key) + ")"); }

Salida:

Alice (ID = 2) Bob (ID = 1) John (ID = 3)