java - sort - Cómo obtener la clave y el valor de un TreeMap en un índice particular
sort linkedhashmap (6)
Tengo un TreeMap con un conjunto de pares ''Clave y Valor''. ¿Cómo puedo obtener tanto la clave como el valor en un índice particular del mapa de árbol?
EDITAR: @ TO-ALL: Gracias. Pero sé cómo implementarlo mediante un ArrayList adicional. Solo pensé que hay alguna forma de lograr esto sin usar un ArrayList adicional.
Aquí hay otra opción para obtener la clave de un valor:
Map<String, String> map = new HashMap<String, String>();
map.put("s1", "s1Val");
map.put("s2", "s2Val");
map.put("s3", "s3Val");
// ex: "s2Val" -> return "s2"
int index = new ArrayList<String>(map.values()).indexOf("s2Val");
System.out.println(map.keySet().toArray()[index]); // -> return "s2"
En primer lugar, no estoy seguro de por qué la gente aquí con tanta frecuencia se preocupa por la validez de una pregunta. Existen numerosos casos en los que las personas han considerado oportuno mantener un ArrayList en orden ordenado. Mantener una ArrayList en orden ordenado es muy ineficiente para listas grandes.
Los nodos de entrada de la distribución de origen estándar de Java (Oracle) no mantienen el tamaño de sus árboles descendientes. Debido a esto, no es posible identificar un elemento dentro del mapa por índice sin una búsqueda secuencial ineficiente.
Encuentro este inconveniente tan grave que he escrito mi propio mapa AVL que puede obtener elementos de manera eficiente mediante el índice y el índice de cómputo (E). Hacer esto posible es tan simple como mantener los tamaños de cada una de las ramas izquierda y derecha de una Entrada. Existe la posibilidad de que la biblioteca Glazedlists tenga un árbol de búsqueda incrustado en algún lugar. Es posible que desee revisar eso.
Esto podría ser útil
TreeMap< String,Integer > ht=new TreeMap<>();
ht.put("12",1);
ht.put("22",2);
ht.put("32",3);
ht.put("42",4);
for(int i=0;i<ht.size();i++)
{
System.out.println(new Vector(ht.keySet()).get(i));
System.out.println(new Vector(ht.values()).get(i));
}
Puede copiar el conjunto de entradas en una lista de matrices y luego obtener la entrada deseada por índice:
list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);
Pero a) la copia lleva O (N) tiempo yb) cuando cambia TreeMap, la lista se vuelve inválida.
Puede que esta no sea la mejor manera, pero podrá acceder a su clave / valor en un índice particular.
TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);
Si realmente desea utilizar TreeMap y obtener una posición, puede usar lo siguiente:
key => treemap.keySet().toArray()[0]
value => treemap.get(key);
O (si solo quieres valor)
treemap.values().toArray()[0];
Pero le sugiero que use iterador, como en el método anterior, necesita crear una matriz cada vez que quiera encontrarla (por lo tanto, no es tan eficiente) y también debe tener el cuidado de asegurarse de que el índice no esté fuera de alcance.