2012-05-05 19 views
96

Mam HashMap w Javie tak:Zdobądź klucze HashMap Java

private Map<String, Integer> team1 = new HashMap<String, Integer>(); 

Potem wypełnić go tak:

team1.put("United", 5); 

Jak mogę dostać klucze? Coś jak: team1.getKey(), aby powrócić "United".

+8

Mapa zawiera kilka kluczy. To słownik. Twoje pytanie nie ma sensu. –

+0

Czego można się spodziewać po 'team1.getKey()', jeśli: (1) mapa jest pusta, lub (2) jeśli zawiera wiele kluczy? – NPE

+0

'int' powinno być używane dla pojedynczych takich jak ten. –

Odpowiedz

205

A HashMap zawiera więcej niż jeden klucz. Możesz użyć keySet(), aby uzyskać zestaw wszystkich kluczy.

team1.put("foo", 1); 
team1.put("bar", 2); 

będzie przechowywać 1 z kluczem "foo" i 2 z kluczem "bar". Iteracyjne nad wszystkimi klawiszami:

for (String key : team1.keySet()) { 
    System.out.println(key); 
} 

wypisze "foo" i "bar".

+0

Ale w tym przypadku mam tylko jeden klucz dla każdej wartości. Nie można napisać czegoś takiego jak team1.getKey()? – masb

+0

Nie masz mapy z jednym elementem. Ale jest to mapa: struktura, która może zawierać więcej niż jeden element. – Matteo

+10

Jaki jest sens mapy za pomocą jednego klucza? Utwórz klasę za pomocą pola klucza i pola wartości. –

5

Możesz pobrać wszystkie klucze Map za pomocą metody keySet(). Teraz, jeśli potrzebujesz klucza z jego wartością o wartości, to jest zupełnie inna sprawa i Map nie pomoże ci tam; potrzebna jest wyspecjalizowana struktura danych, taka jak BidiMap (mapa, która umożliwia dwukierunkowe wyszukiwanie między kluczem a wartościami) z Apache'a o numerze Commons Collections - należy również pamiętać, że kilka różnych kluczy może zostać odwzorowanych na tę samą wartość.

18

Sprawdź to.

http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

Zakładając, że masz inną wartość dla każdego klucza, można zrobić coś takiego:

private String getKey(Integer value){ 
    for(String key : team1.keySet()){ 
     if(team1.get(key).equals(value)){ 
      return key; //return the first found 
     } 
    } 
    return null; 
} 

Albo jeśli nie można zakładać, że każdy klucz ma wartość Differente:

private List<String> getKeys(Integer value){ 
    List<String> keys = new ArrayList<String>(); 
    for(String key : team1.keySet()){ 
     if(team1.get(key).equals(value)){ 
      keys.add(key); 
     } 
    } 
    return keys; 
} 

lub używając JDK8

private Optional<String> getKey(Integer value){ 
    return team1 
     .entrySet() 
     .stream() 
     .filter(e -> e.getValue().equals(value)) 
     .map(e -> e.getKey()) 
     .findFirst(); 
} 

private List<String> getKeys(Integer value){ 
    return team1 
     .entrySet() 
     .stream() 
     .filter(e -> e.getValue().equals(value)) 
     .map(e -> e.getKey()) 
     .collect(Collectors.toList()); 
} 
+0

Ale co się dzieje, gdy kilka klawiszy odwzorowuje tę samą wartość? powinieneś zwrócić listę kluczy zamiast: –

0

Jeśli potrzebujesz tylko czegoś prostego i większego z weryfikacji.

public String getKey(String key) 
{ 
    if(map.containsKey(key) 
    { 
     return key; 
    } 
    return null; 
} 

Następnie można wyszukać dowolny klucz.

System.out.println("Does this key exist? : " + getKey("United")); 
2
private Map<String, Integer> _map= new HashMap<String, Integer>(); 
Iterator<Map.Entry<String,Integer>> itr= _map.entrySet().iterator(); 
       //please check 
       while(itr.hasNext()) 
       { 
        System.out.println("key of : "+itr.next().getKey()+" value of  Map"+itr.next().getValue()); 
       } 
-1

Wypróbuj ten prosty program:

public class HashMapGetKey { 

public static void main(String args[]) { 

     // create hash map 

     HashMap map = new HashMap(); 

     // populate hash map 

     map.put(1, "one"); 
     map.put(2, "two"); 
     map.put(3, "three"); 
     map.put(4, "four"); 

     // get keyset value from map 

Set keyset=map.keySet(); 

     // check key set values 

     System.out.println("Key set values are: " + keyset); 
    }  
} 
-1
public class MyHashMapKeys { 

    public static void main(String a[]){ 
     HashMap<String, String> hm = new HashMap<String, String>(); 
     //add key-value pair to hashmap 
     hm.put("first", "FIRST INSERTED"); 
     hm.put("second", "SECOND INSERTED"); 
     hm.put("third","THIRD INSERTED"); 
     System.out.println(hm); 
     Set<String> keys = hm.keySet(); 
     for(String key: keys){ 
      System.out.println(key); 
     } 
    } 
} 
+0

Zwykle kopiuje istniejące odpowiedzi. -1 –

26

Jest to wykonalne, przynajmniej w teorii, jeśli znasz indeksu:

System.out.println(team1.keySet().toArray()[0]); 

keySet() zwraca listę, więc konwertujesz listę do tablicy.

Problem polega oczywiście na tym, że zestaw nie obiecuje zachować zamówienia. Jeśli masz tylko jeden przedmiot w swojej HashMapie, jesteś dobry, ale jeśli masz więcej, to najlepiej przeglądać mapę, jak zrobiły to inne odpowiedzi.

+0

Pomógł mi też :) – sTg

-2

Co zrobię, co jest bardzo proste, ale pamięć odpadów jest mapowanie wartości z klucza i zrobić oposite do mapowania klawiszy o wartości co to:

private Map<Object, Object> team1 = new HashMap<Object, Object>();

ważne, że użyć <Object, Object> więc można mapować keys:Value i Value:Keys jak ten

team1.put("United", 5);

team1.put(5, "United");

Więc jeśli używasz team1.get("United") = 5 i team1.get(5) = "United"

Ale jeśli używasz jakiegoś konkretnego sposobu na jednym z obiektów w parach będę lepiej jeśli zrobisz kolejną mapę:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

private Map<Integer, String> team1Keys = new HashMap<Integer, String>();

a następnie

team1.put("United", 5);

team1Keys.put(5, "United");

i pamiętać, keep it simple;)

-1

Aby uzyskać Key i jego wartość

np

private Map<String, Integer> team1 = new HashMap<String, Integer>(); 
    team1.put("United", 5); 
    team1.put("Barcelona", 6); 
    for (String key:team1.keySet()){ 
        System.out.println("Key:" + key +" Value:" + team1.get(key)+" Count:"+Collections.frequency(team1, key));// Get Key and value and count 
       } 

wypisze: Klucz: Łączna wartość: 5 Klucz: Barcelona Wartość: 6