2011-11-13 11 views
26

Voglio ottenere la chiave di una HashMap utilizzando il valore.Ottieni la chiave da una HashMap utilizzando il valore

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

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

Ciò significa che voglio una funzione che assumerà il valore 100 e restituirà la stringa uno.

Sembra che ci siano molte domande qui che chiedono la stessa cosa ma non funzionano per me.

Forse perché sono nuovo con java.

Come fare?

+0

100 è il valore e non una chiave. Devi scambiare "uno" e 100 e così via o hai bisogno di un BiMap. Il primo argomento è la chiave e il secondo argomento è il valore. –

+0

@Fatal la prossima volta fornisci una risposta;) Sei stato 10 secondi più veloce di me. – Bozho

+0

@Bozho Lo farò la prossima volta. :-) –

risposta

62

Il metodo put in HashMap è definita in questo modo:

Object put(Object key, Object value) 

chiave è il primo parametro, così nel tuo put, "one" è la chiave. Non si può facilmente cercare per valore in una HashMap, se si vuole veramente farlo, sarebbe una ricerca lineare fatto chiamando entrySet(), in questo modo:

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

Tuttavia, questo è O (n) e tipo di sconfiggere lo scopo di usare una HashMap a meno che non sia necessario farlo raramente. Se vuoi veramente essere in grado di cercare frequentemente per chiave o valore, il core Java non ha nulla per te, ma qualcosa come BiMap dalle Google Collections è quello che vuoi.

+0

Questo verrà eseguito solo durante il debug in modo che il tempo di esecuzione non sia un problema. – kechapito

+1

+1, anche se trovo che l'iterazione sulla voce sia un po 'più semplice in quanto contiene il valore nell'elemento. Tuttavia, senza BiMap l'OP deve mantenere invariati i "valori unici" al di fuori della mappa. –

+0

@MarkPeters: Grazie. Volevo farlo ma le mie dita non hanno collaborato. entrySet è più efficiente in quanto non è necessario eseguire ricerche per ogni iterazione di keySet. – kbyrd

4

Hai invertito. Il 100 dovrebbe essere il primo parametro (è la chiave) e "uno" dovrebbe essere il secondo parametro (è il valore).

Leggere il javadoc per HashMap e che potrebbe aiutare a: HashMap

Per ottenere il valore, utilizzare hashmap.get(100).

+0

Ops l'ho scritto invertito. Io lo aggiusterò. – kechapito

5
  • Se avete bisogno di solo che, è sufficiente utilizzare put(100, "one"). Si noti che la chiave è il primo argomento e il valore è il 2 °.
  • se avete bisogno di essere in grado di ottenere sia la chiave e il valore, utilizzare BiMap (da guava)
0

se quello di ottenere "ONE", dando in 100 poi

inizializzare hash mappa

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

haspmap.put(100,"one");

e recuperare il valore da hashMap.get(100)

speranza che aiuti.

+0

Non proprio perché ho fatto questa mappa in questo modo per dare la stringa e restituire il valore. Ora ho bisogno di fare l'opposto per il debug. – kechapito

4

Hai mescolato le chiavi e i valori.

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

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

Successivamente un

hashmap.get(100); 

vi darà "uno"

+0

Non sono sicuro del motivo per cui sei stato votato .... Mi sembrava un errore plausibile da parte dell'OP. @AHungerArtist ha anche detto di averlo invertito nei commenti qui sotto. – 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

Il semplice codice non è una risposta. Devi spiegare. – EJP

23

Possiamo ottenere KEY da VALUE. Di seguito è riportato un esempio di codice_

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; } }

Spero che questo possa aiutare tutti.

+1

Questo è migliore della risposta accettata. –

+1

Un piccolo metodo geniale - ha funzionato a meraviglia per quello di cui avevo bisogno - Farò buon uso di questo esempio negli anni a venire. – thonnor

Problemi correlati