2010-03-29 24 views
8

Tengo un HashMap y necesito buscar un elemento por su valor entero. Noté que hay una función containsValue(), pero parece que todavía tengo que recorrer el mapa para encontrar el índice correcto de todos modos.HashMap.containsValue - ¿Cuál es el punto?

Mi pregunta es; ¿Por qué usar containsValue() si tengo que atravesarlo después?

Además, ¿me falta el punto por completo? ;-)

Respuesta

7

Un mapa asigna una clave a un valor. Si tiene un valor y sabe que el mapa contiene este valor, ¿por qué necesita la clave más?

Por otro lado, si usted realmente necesita la llave o si tiene sólo una propiedad del valor, puede repetir la entrySet(), comprobar el valor y devolver la llave si se encuentran:

for (Map.Entry<Index,Value> entry : map.entrySet()) { 
    if (entry.getValue().getXy().equals(xy)) { 
    return entry.getKey(); 
    } 
} 
5

Un mapa es una clave a tienda de valores. Decir que se contiene un valor solo se da como una indicación. Creo que para tener el enlace bijective que le permite recuperar la clave del valor, tendrá que confiar en cosas como BiMap de google-collections

1

Puede usar containsValue() en los casos donde no necesita atravesar todo el hashmap, por ejemplo, si desea agregar pares clave-valor a hashmap, pero antes de eso, desea saber si ese valor está en hashmap. En este caso, para la operación de agregar no es necesario recorrer todo el hashmap.

+2

containsValue() atravesará el HashMap: http://www.docjar.com/html/api/java/util/HashMap.java.html#631 Si quiere saber si un valor está en el Mapa , esta información debe mantenerse en un Conjunto separado. –

+0

sí, lo sé, pero su pregunta era "¿por qué usar containsValue() si tengo que atravesarlo después?" así que lo traduje al por qué es válido para containsValue si necesita atravesar el hashmap después (por segunda vez). – sanjuro

2

No es necesario que lo atraviese después. containsValue() es útil en situaciones en las que no necesita saber con precisión dónde está el valor, sino cuando solo necesita saber si ya está en el mapa. En situaciones en las que necesita saber con precisión en qué lugar del mapa se encuentra el valor, no se moleste en usar containsValue() - salte directamente al iterador y encuéntrelo.

3

Un HashMap (o mapa en general) utiliza pares clave/valor. Cuando agrega algo al mapa, debe especificar una clave y esa es la clave que se utilizará más adelante al recuperar el valor. Basado en la implementación de HashMap, dada una clave, la recuperación de un valor se realiza en O (1) vez.

containsValue es un método útil para comprobar que un HashMap contiene el valor que está buscando, pero realmente no veo por qué lo está utilizando para recuperar el valor que está buscando ??

La forma correft utilizar un mapa sería algo así como:

HashMap<Integer, Object> myMap = new HashMap<Integer, Object>(); 
myMap.put(1, object1); 
myMap.put(2, object2); 
myMap.put(3, object3); 

Ahora usted puede conseguir sus objetos haciendo:

Object myObject = myMap.get(1); 

Si lo hizo:

myMap.containsValue (1);

esto devolvería falso, ya que 1 es la clave, no el valor. Se podría hacer:

myMap.containsKey(1); 

si lo que desea saber si es que existe, pero no hay ningún problema en llamar:

Object myObject = myMap.get(99); 

que sólo devuelve un valor nulo si no había llave, 99.

Así que, básicamente, el punto es que estás en lo cierto, no tiene sentido usar containsValue cuando tratas de recuperar el valor. Usa get o containsKey si quieres verificar primero si hay existencia.

0

Let me replantee esta pregunta para Frederik:

Bueno, containsValue(), ¿se compara internamente (su parámetro de entrada) con cada "valor" en el hashmap? ¿O usa de alguna manera hashcodeing (u otra técnica) para generar el resultado? Para el primer caso, podríamos simplemente usar un iterador para recorrer y hacer coincidir la existencia de nuestro valor con todo el "valor" de hashmap. ¡El significado de la pregunta está en el rendimiento o la velocidad!

+0

No veo cómo reformular la pregunta es beneficioso en este caso. – andrel

+0

las respuestas previas están fuera de contexto. –