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

  • ¿Qué se entiende por «posición»? HashMaps no están ordenados, de modo que no tienen la noción usual de la «posición» que sería algo como un Vector.
  • Qué entiende usted por su orden de inserción o algún otro pedido?
  • orden de inserción.
InformationsquelleAutor Eugene | 2011-03-08

13 Comentarios

  1. 88

    HashMaps no conservar el orden:

    Esta clase no garantiza
    el orden del mapa; en particular,
    no garantiza que el orden
    permanecerá constante a lo largo del tiempo.

    Echa un vistazo a LinkedHashMap, lo que garantiza una predicción de la iteración orden.

    • Esto no contesta la pregunta. Las otras respuestas son más útiles.
    • Con respeto, esta documentación de la cites que directamente responde a la pregunta
    • Incluso si el orden no es constante a lo largo del tiempo, aún podría ser posible para recuperar uno de los miembros por una posición dada.
    • No sigo. Explique?
    • El HashMap enlace está roto/404.
  2. 98

    Utilizar un LinkedHashMap y cuando usted necesita para recuperar la posición, convertir los valores en un 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);
    • Siempre es necesario crear una instancia de una copia de las llaves de HashMap??
  3. 43

    Si quieres mantener el orden en que se agregaron los elementos del mapa, utilice LinkedHashMap frente a sólo el HashMap.

    Aquí es un enfoque que le permita obtener un valor por su índice en el mapa:

    public Object getElementByIndex(LinkedHashMap map,int index){
        return map.get( (map.keySet().toArray())[ index ] );
    }
    • Más simple que tengo que decir… en Vez de convertir a cada cosa, usted está usando sólo el conjunto de claves. Excelente
  4. 15

    Si, por alguna razón, tienes que meter con el hashMap, usted puede convertir el conjunto de teclas para una matriz y el índice de las claves de la matriz para obtener los valores en el mapa así:

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

    Luego puede acceder al mapa como:

    map.get(keys[i]);
    • Tenga en cuenta que arr[i] debe cambiar a: teclas[i]
    • Ok, he Cadenas como mapa de teclas, para conseguir uno de ellos, la segunda parte será: String myKey = keys[i].toString();
  5. 12

    Uso LinkedHashMap:

    De la tabla Hash y lista enlazada de la implementación de la interfaz de Mapa, con la predicción de la iteración de la orden. Esta aplicación se diferencia de HashMap en que mantiene una lista doblemente vinculadas a correr a través de todas sus entradas.

    • que va a conservar el orden, pero aún no puede acceder a los elementos por su índice. Tendrías que recorrer
    • este enlace es para una versión anterior de la API. Yo sugeriría que une a una Java 6 o 7 de la API.
  6. 6

    Uso LinkedHashMap y el uso de esta función.

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

    Definir como este 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;
        }

    Que la función puede devolver la entrada seleccionada.

  7. 3

    Otro enfoque de trabajo es la transformación de mapa de valores en un array y luego recuperar el elemento en el índice. La ejecución de la prueba de 100 000 elemento mediante el índice de búsquedas en LinkedHashMap de 100 000 objetos utilizando los siguientes enfoques condujo a los siguientes resultados:

    //My answer:
    public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
        return map.values().toArray(new Particle[map.values().size()])[index];
    } //68 965 ms
    
    //Syd Lambert's answer:
    public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
        return map.get( (map.keySet().toArray())[ index ] );
    } //80 700 ms

    Todo en la recuperación de elemento mediante el índice de LinkedHashMap parece ser bastante pesado operación.

  8. 2

    HashMap – y la estructura de datos subyacente – tablas de hash, no tienen una noción de posición. A diferencia de una LinkedList o Vector, la tecla de entrada se transforma en un ‘cubo’ donde se almacena el valor. Estos cubos no están ordenados en una forma que tenga sentido fuera de la HashMap interfaz y como tal, los elementos que se incluyen en el HashMap no están en orden, en el sentido de que se puede esperar con el resto de estructuras de datos

  9. 2

    HashMap no tiene el concepto de posición de modo que no hay manera de conseguir un objeto por la posición. Los objetos en los Mapas de conjunto y obtener por las teclas.

  10. 2

    Estoy asumiendo por ‘la posición’ que se está refiriendo el orden en el que se ha insertado los elementos en el HashMap. En el caso de que usted desea utilizar un LinkedHashMap. El LinkedHashMap no ofrece un método de descriptor de acceso; sin embargo, usted tendrá que escribir uno como

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

    HashMaps no permitir el acceso por posición, sólo sabe acerca de el código hash y se puede recuperar el valor, si es que puede calcular el código hash de la clave. Diagramas de árbol tiene una noción de orden. Linkedhas mapas de preservar el orden en el que entraron en el mapa.

  12. 1

    puede utilizar el siguiente código para obtener la clave :
    String [] keys = (String[]) item.keySet().toArray(new String[0]);

    y obtener el objeto o lista, que se inserta en el HashMap con clave de este elemento como este :
    item.get(keys[position]);

  13. 0

    Usted puede tratar de implementar algo así, mira:

    Map<String, Integer> map = new LinkedHashMap<String, Integer>();
    map.put("juan", 2);
    map.put("pedro", 3);
    map.put("pablo", 5);
    map.put("iphoncio",9)
    
    List<String> indexes = new ArrayList<String>(map.keySet()); //<== Parse
    
    System.out.println(indexes.indexOf("juan"));     //==> 0
    System.out.println(indexes.indexOf("iphoncio"));      //==> 3

    Espero que esto funcione para usted.

Dejar respuesta

Please enter your comment!
Please enter your name here