2011-11-13 45 views
26

Quiero obtener la clave de un HashMap usando el valor.Obtener clave de un HashMap usando el valor

hashmap = new HashMap<String, Object>(); 

haspmap.put("one", 100); 
haspmap.put("two", 200); 

Lo que significa que quiero una función que tomará el valor 100 y devolverá la cadena uno.

Parece que hay muchas preguntas aquí que piden lo mismo, pero no funcionan para mí.

Tal vez porque soy nuevo con Java.

¿Cómo hacerlo?

+0

100 es el valor y no una clave. O bien tiene que cambiar "uno" y 100 y así sucesivamente o necesita un BiMap. Primero arg es la clave y segundo arg es el valor. –

+0

@Fatal la próxima vez que lo proporcione como respuesta;) Usted fue 10 segundos más rápido que yo. – Bozho

+0

@Bozho Lo haré la próxima vez. :-) –

Respuesta

62

El método de puesta en HashMap se define así:

clave
Object put(Object key, Object value) 

es el primer parámetro, por lo en tu puesto, "uno" es la clave. No se puede buscar fácilmente por el valor en un HashMap, si realmente quieres hacer eso, sería una búsqueda lineal hecho llamando entrySet(), así:

for (Map.Entry<Object, Object> e : hashmap.entrySet()) { 
    Object key = e.getKey(); 
    Object value = e.getValue(); 
} 

Sin embargo, eso es O (n) y en cierto modo, anula el propósito de usar un HashMap a menos que solo necesite hacerlo en raras ocasiones. Si realmente desea poder buscar por clave o por valor con frecuencia, Core Java no tiene nada para usted, pero algo como BiMap de Google Collections es lo que desea.

+0

Esto se ejecutará solo durante la depuración, por lo que el tiempo de ejecución no es un problema. – kechapito

+1

+1, aunque creo que iterar sobre la entrada es un poco más sencillo ya que contiene el valor en el elemento. Aún así, sin el BiMap, el OP necesita mantener la invariante de "valores únicos" fuera del mapa. –

+0

@MarkPeters: gracias. Quise hacer eso pero mis dedos no cooperaron. entrySet es más eficiente, ya que no necesita hacer búsquedas para cada iteración de keySet. – kbyrd

4

Lo ha invertido. El 100 debe ser el primer parámetro (es la clave) y el "uno" debe ser el segundo parámetro (es el valor).

Lee el javadoc de HashMap y que te pueden ayudar: HashMap

para obtener el valor, utilice hashmap.get(100).

+0

Operaciones lo escribí al revés. Yo lo arreglare. – kechapito

5
  • Si necesita solamente que, basta con utilizar put(100, "one"). Tenga en cuenta que la clave es el primer argumento, y el valor es el 2do.
  • Si tiene que ser capaz de obtener por tanto la clave como el valor, utilice BiMap (de guayaba)
0

si lo que permite obtener "UNO" cediendo 100 entonces

inicializar de hash mapa

hashmap = new HashMap<Object,String>();

haspmap.put(100,"one");

y recuperar el valor de hashMap.get(100)

Espero que ayude.

+0

No es realmente porque hice este mapa así para dar la cadena y devolver el valor. Ahora necesito lo contrario para la depuración. – kechapito

4

Has mezclado las claves y los valores.

Hashmap <Integer,String> hashmap = new HashMap<Integer, String>(); 

hashmap.put(100, "one"); 
hashmap.put(200, "two"); 

Después de un

hashmap.get(100); 

le dará "una"

+0

No estoy seguro de por qué votaste ... Parecía un error plausible por parte del OP. @AHungerArtist incluso dijo que lo invirtió en los comentarios a continuación. – jww

1
public class Class1 { 
private String extref="MY"; 

public String getExtref() { 
    return extref; 
} 

public String setExtref(String extref) { 
    return this.extref = extref; 
} 

public static void main(String[] args) { 

    Class1 obj=new Class1(); 
    String value=obj.setExtref("AFF"); 
    int returnedValue=getMethod(value);  
    System.out.println(returnedValue); 
} 

/** 
* @param value 
* @return 
*/ 
private static int getMethod(String value) { 
     HashMap<Integer, String> hashmap1 = new HashMap<Integer, String>(); 
     hashmap1.put(1,"MY"); 
     hashmap1.put(2,"AFF"); 

     if (hashmap1.containsValue(value)) 
     { 
      for (Map.Entry<Integer,String> e : hashmap1.entrySet()) { 
       Integer key = e.getKey(); 
       Object value2 = e.getValue(); 
       if ((value2.toString()).equalsIgnoreCase(value)) 
       { 
        return key; 
       } 
      } 
     } 
     return 0; 

} 
} 
+0

El código simple no es una respuesta. Tienes que explicar – EJP

23

Podemos obtener KEY de VALUE. A continuación se muestra un código de ejemplo_

public class Main { 
    public static void main(String[] args) { 
    Map map = new HashMap(); 
    map.put("key_1","one"); 
    map.put("key_2","two"); 
    map.put("key_3","three"); 
    map.put("key_4","four");
System.out.println(getKeyFromValue(map,"four")); } public static Object getKeyFromValue(Map hm, Object value) { for (Object o : hm.keySet()) { if (hm.get(o).equals(value)) { return o; } } return null; } }

Espero que esto ayude a todos.

+1

Esto es mejor que la respuesta aceptada. –

+1

Pequeño método brillante: funcionó como un regalo para lo que necesitaba. Voy a aprovechar este ejemplo en los próximos años, reconozco. – thonnor

Cuestiones relacionadas