Saltar al contenido

Cómo obtener la posición de key/valor en LinkedHashMap usando su key

Posteriormente a investigar en varios repositorios y sitios webs de internet al final encontramos la respuesta que te mostraremos aquí.

Solución:

HashMap Las implementaciones en general no están ordenadas para Iteration.

LinkedHashMap es predeciblemente pedido para Iteration ( orden de inserción ) pero no expone el List interfaz y un LinkedList (que es lo que refleja el key establecer el orden de inserción) tampoco rastrea la posición del índice en sí mismo, es muy ineficiente encontrar el índice también. los LinkedHashMap no expone la referencia a la interna LinkedList o.

El actual “Lista enlazada” el comportamiento es específico de la implementación. Algunos pueden usar una instancia de LinkedList algunos muchos solo tienen
Entry seguir un anterior y siguiente Entry y usar eso como su implementación. No asumas nada sin mirar la fuente.

los KeySet que contiene el keys tampoco garantiza el orden debido a los algoritmos hash utilizados para la colocación en la estructura de datos de respaldo del heredado HashMap. Así que no puedes usar eso.

La única forma de hacer esto, sin escribir su propia implementación, es recorrer el Iterator que utiliza la duplicación LinkedList y mantenga un conteo donde se encuentra, esto será muy ineficiente con grandes conjuntos de datos.

Solución

Lo que parece que quieres es posiciones de índice del pedido de inserción originaltendrías que reflejar el keys en el KeySet en algo como un ArrayListmanténgalo sincronizado con las actualizaciones del HashMap y utilícelo para encontrar la posición. Crear una subclase de HashMapdecir IndexedHashMap y agregando esto ArrayList internamente y agregando un .getKeyIndex( key) que delega en el interior ArrayList.indexOf() es probablemente la mejor manera de hacer esto.

Esto es lo que LinkedHashMap hace pero con un LinkedList reflejando el KeySet en lugar de un ArrayList.

int pos = new ArrayList(info.keySet()).indexOf("jeremy")

Vi una sugerencia de uno de los duplicados de esta pregunta en

Cómo obtener valor de LinkedHashMap basado en el índice, no en key?

y me gustó la sugerencia descrita como pseudocódigo de @schippi en los comentarios. Pensé que algún código Java en funcionamiento podría ser útil para otros en este enfoque

import java.util.ArrayList;
import java.util.LinkedHashMap;

public class IndexedLinkedHashMap extends LinkedHashMap 

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    ArrayList al_Index = new ArrayList();

    @Override
    public V put(K key,V val) 
        if (!super.containsKey(key)) al_Index.add(key);
        V returnValue = super.put(key,val);
        return returnValue;
    

    public V getValueAtIndex(int i)
        return (V) super.get(al_Index.get(i));
    

    public K getKeyAtIndex(int i) 
        return (K) al_Index.get(i);
    

    public int getIndexOf(K key) 
        return al_Index.indexOf(key);
    


Si entiendes que te ha resultado de utilidad nuestro artículo, agradeceríamos que lo compartas con otros juniors de este modo contrubuyes a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *