Pregunta ¿Es posible obtener elemento de HashMap por su posición?


Cómo recuperar un elemento de HashMap por su posición, ¿es posible?


75
2018-03-08 19:10


origen


Respuestas:


HashMaps no preservar el orden:

Esta clase no garantiza que   el orden del mapa; en particular,   no garantiza que la orden   se mantendrá constante a lo largo del tiempo

Echa un vistazo a LinkedHashMap, lo que garantiza un orden de iteración predecible.


82
2018-03-08 19:15



Use un LinkedHashMap y cuando necesite recuperar por posición, convierta los valores en ArrayList.

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");
/* Get by position */
int pos = 1;
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);

88
2018-04-28 14:14



Si desea mantener el orden en el que agregó los elementos al mapa, use LinkedHashMap en lugar de simplemente HashMap.

Aquí hay un enfoque que le permitirá obtener un valor por su índice en el mapa:

public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}

31
2017-10-27 17:55



Utilizar LinkedHashMap:

Tabla hash e implementación de lista enlazada de la interfaz de Mapa, con orden de iteración predecible. Esta implementación difiere de HashMap en que mantiene una lista doblemente enlazada que se ejecuta a través de todas sus entradas.


11
2018-03-08 19:16



Si, por alguna razón, tiene que seguir con hashMap, puede convertir keySet en una matriz e indexar las claves en la matriz para obtener los valores en el mapa de la siguiente manera:

Object[] keys = map.keySet().toArray();

A continuación, puede acceder al mapa como:

map.get(keys[i]);

9
2018-06-15 10:27



Use LinkedHashMap y use esta función.

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();

Defina así y.

private Entry getEntry(int id){
        Iterator iterator = map.entrySet().iterator();
        int n = 0;
        while(iterator.hasNext()){
            Entry entry = (Entry) iterator.next();
            if(n == id){
                return entry;
            }
            n ++;
        }
        return null;
    }

La función puede devolver la entrada seleccionada.


6
2018-05-20 04:21



HashMap - y la estructura de datos subyacente - tablas hash, no tienen una noción de posición. A diferencia de LinkedList o Vector, la clave de entrada se transforma en un 'cubo' donde se almacena el valor. Estos depósitos no están ordenados de manera que tengan sentido fuera de la interfaz HashMap y, por lo tanto, los elementos que coloca en el HashMap no están en orden en el sentido que esperaría con las otras estructuras de datos.


2
2018-03-08 19:16



HashMap no tiene ningún concepto de posición, por lo que no hay forma de obtener un objeto por posición. Los objetos en Maps están configurados y obtienen por las teclas.


2
2018-03-08 19:16



Supongo que por 'posición' te estás refiriendo al orden en el que has insertado los elementos en el HashMap. En ese caso, quiere usar un LinkedHashMap. Sin embargo, LinkedHashMap no ofrece un método de acceso; deberás escribir uno como

public Object getElementAt(LinkedHashMap map, int index) {
    for (Map.Entry entry : map.entrySet()) {
        if (index-- == 0) {
            return entry.value();
        }
    }
    return null;
}

2
2018-03-08 19:19