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 siguienteEntry
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 ArrayList
manténgalo sincronizado con las actualizaciones del HashMap
y utilícelo para encontrar la posición. Crear una subclase de HashMap
decir IndexedHashMap
y agregando esto ArrayList
internamente y agregando un .getKeyIndex(
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.