2012-06-22 53 views
14

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 de TreeMap?Cómo obtener la clave y el valor de un TreeMap en un índice particular

EDITAR: @ ​​TO-ALL: Gracias. Pero sé cómo implementarlo usando una ArrayList adicional. Solo pensé que hay alguna forma de lograr esto sin usar una ArrayList adicional.

+2

¿Por qué quieres hacer eso? Los índices son internos a la implementación de TreeMap. No deberías usarlos. Siempre debe confiar únicamente en los métodos 'keys()', 'values ​​()' y 'get (key)'. –

+1

Es bastante deliberado que no puede hacer esto, excepto simplemente iterando a través del 'entrySet' en tiempo lineal. –

+0

Estoy desarrollando una aplicación de música y tengo que almacenar el nombre del álbum en clave y álbum en valor. La situación es así para que pueda obtener la clave y el valor. Puedo lograr mi tarea usando una ArrayList adicional, pero quiero implementarla simplemente. –

Respuesta

2

Puede que esta no sea la mejor manera, pero podrá acceder a su clave/valor en un índice en 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); 
19

Si realmente desea utilizar TreeMap y obtener por la posición, puede utilizar el siguiente:

key => treemap.keySet().toArray()[0] 
value => treemap.get(key); 

O (si lo que desea el valor)

treemap.values().toArray()[0]; 

pero me gustaría le sugerimos que use iterator, como en el método anterior, necesita crear una matriz cada vez que quiera encontrarla (por lo que no es tan eficiente) y también debe tener cuidado suficiente para asegurarse de que el índice no se salga de su alcance.

+0

Creo esta matriz solo una vez en la puesta en marcha, y luego la guardo como una tabla de búsqueda.Además, aquí hay un ejemplo para obtener una matriz tipada 'myMap.keySet(). ToArray (nuevo Entero [0]);' ¡Gracias! – gnB

3

Puede copiar conjunto de entrada en una lista de arreglo y luego obtener la entrada deseada por el índice:

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet()); 
Map.Entry<K,V>=list.get(index); 

Pero a) copia toma tiempo O (N) y b) cuando los cambios de mapa de árbol, la lista de ser válida.

5

En primer lugar, no estoy seguro de por qué las personas aquí con tanta frecuencia se preocupan por la validez de una pregunta. Existen numerosos casos en los que las personas han considerado oportuno mantener un ArrayList en orden ordenado. Mantener un ArrayList en orden ordenado es extremadamente ineficiente para listas grandes.

Los nodos de entrada de la distribución de origen Java (Oracle) estándar 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 por índice y calcular indexOf (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 insertado en algún lugar. Es posible que desee revisar eso.

-2

aquí es una 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" 
+0

no relacionado con la pregunta OP preguntó. Además, 'Map' no garantiza el orden – frugalcoder

0

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)); 
} 
Cuestiones relacionadas