Uzyskaj klucze z HashMap w Javie

166

Mam taką Hashmapę w Javie:

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

Następnie wypełniam to tak:

team1.put("United", 5);

Jak mogę zdobyć klucze? Coś w stylu: team1.getKey()powrót "United".

masb
źródło
Czego spodziewasz team1.getKey()się zwrócić, jeśli: (1) mapa jest pusta lub (2) jeśli zawiera wiele kluczy?
NPE
intpowinien być używany do takich pojedynczych.
stommestack

Odpowiedzi:

312

A HashMapzawiera 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ć 1z kluczem "foo"i 2kluczem "bar". Aby powtórzyć wszystkie klucze:

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

wydrukuje "foo"i "bar".

Matteo
źródło
Ale w tym przypadku mam tylko jeden klucz dla każdej wartości. Nie można napisać czegoś takiego jak team1.getKey ()?
masb
Nie, masz mapę z jednym elementem. Ale to mapa: struktura, która może zawierać więcej niż jeden element.
Matteo
13
Jaki jest sens mapy z jednym kluczem? Utwórz klasę z polem kluczowym i polem wartości.
JB Nizet
Źle zrozumiałem swój problem. Dziękuję za odpowiedzi.
masb
3
Jeśli chcesz przechowywać wszystkie klucze w tablicy tablic:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani
50

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

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

keySet() zwraca zestaw, więc konwertujesz zestaw na tablicę.

Problem polega oczywiście na tym, że zestaw nie obiecuje dotrzymania zamówienia. Jeśli masz tylko jeden element w HashMap, jesteś dobry, ale jeśli masz więcej, najlepiej jest zapętlić mapę, tak jak zrobiły to inne odpowiedzi.

james.garriss
źródło
Jest to przydatne w scenariuszach testów jednostkowych, w których masz pełną kontrolę nad zawartością pliku HashMap. Dobry występ.
riseTide
Nie ma nic o znajomości indeksu w pytaniu.
Markiz Lorne
23

Sprawdź to.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

(Użyj, java.util.Objects.equalsponieważ HashMap może zawierać null)

Korzystanie z JDK8 +

/**
 * Find any key matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return Any key matching the value in the team.
 */
private Optional<String> getKey(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .findAny();
}

/**
 * Find all keys matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return all keys matching the value in the team.
 */
private List<String> getKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

Bardziej „ogólne” i tak bezpieczne, jak to tylko możliwe

/**
 * Find any key matching the value, in the given map.
 *
 * @param mapOrNull Any map, null is considered a valid value.
 * @param value     The value to be searched.
 * @param <K>       Type of the key.
 * @param <T>       Type of the value.
 * @return An optional containing a key, if found.
 */
public static <K, T> Optional<K> getKey(Map<K, T> mapOrNull, T value) {
    return Optional.ofNullable(mapOrNull).flatMap(map -> map.entrySet()
            .stream()
            .filter(e -> Objects.equals(e.getValue(), value))
            .map(Map.Entry::getKey)
            .findAny());
}

Lub jeśli korzystasz z JDK7.

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

private List<String> getKeys(Integer value){
   List<String> keys = new ArrayList<String>();
   for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
             keys.add(key);
      }
   }
   return keys;
}
Fabio F.
źródło
2
Ale co się stanie, jeśli kilka kluczy ma tę samą wartość? zamiast tego powinieneś zwrócić listę kluczy
Óscar López
@ ÓscarLópez Nie mogą. HashMapklucze są unikalne.
Markiz Lorne
6

Możesz odzyskać wszystkie Mapklucze za pomocą tej metody keySet(). Otóż, jeśli potrzebujesz klucza, biorąc pod uwagę jego wartość , to zupełnie inna sprawa i Mapnie pomoże ci w tym; potrzebowałbyś wyspecjalizowanej struktury danych, takiej jak BidiMap(mapa, która umożliwia dwukierunkowe wyszukiwanie między kluczem a wartościami) z kolekcji Commons firmy Apache - pamiętaj również, że kilka różnych kluczy może być mapowanych na tę samą wartość.

Óscar López
źródło
1

Jeśli potrzebujesz czegoś prostego i bardziej weryfikacji.

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

Następnie możesz wyszukać dowolny klucz.

System.out.println( "Does this key exist? : " + getKey("United") );
tzg
źródło
1
Ta metoda jest całkowicie zbędna.
Markiz Lorne
1
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());
                }
sachin
źródło
Nie działa. Najwyraźniej tego nie próbowałeś. Wywołanie next()dwa razy w pętli oznacza, że ​​wydrukujesz klawisze o numerach nieparzystych wraz z wartościami o numerach parzystych.
Markiz Lorne
0

Użyj operacji funkcjonalnej, aby przyspieszyć iterację.

team1.keySet().forEach((key) -> { System.out.println(key); });

eCuzzy
źródło
-1

Rozwiązaniem może być, jeśli znasz pozycję klucza, przekonwertowanie kluczy na tablicę String i zwrócenie wartości w pozycji:

public String getKey(int pos, Map map) {
    String[] keys = (String[]) map.keySet().toArray(new String[0]);

    return keys[pos];
}
Orici
źródło
Nie ma nic o znajomości indeksu w pytaniu.
Markiz Lorne
-2

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);
   }    
}
raman rayat
źródło
-2
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);
        }
    }
}
Abdul Rizwan
źródło
Po prostu kopiuje istniejące odpowiedzi. -1
james.garriss
-2

Aby uzyskać klucze w HashMap, mamy metodę keySet (), która jest obecna w java.util.Hashmappakiecie. np .:

Map<String,String> map = new Hashmap<String,String>();
map.put("key1","value1");
map.put("key2","value2");

// Now to get keys we can use keySet() on map object
Set<String> keys = map.keySet();

Teraz klucze będą miały wszystkie klucze dostępne na mapie. np .: [klucz1, klucz2]

ghanshyam singh
źródło
java,util.HashMapto klasa, a nie pakiet i nie ma tu niczego, czego nie było tu pięć lat temu.
Markiz Lorne
-3

To, co zrobię, co jest bardzo proste, ale marnuje pamięć, to zmapowanie wartości za pomocą klucza i zrobienie odwrotnej kolejności, aby zmapować klucze z wartością, dzięki której:

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

ważne jest, abyś używał, <Object, Object>aby móc mapować keys:Valuei Value:Keyspolubić to

team1.put("United", 5);

team1.put(5, "United");

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

Ale jeśli użyjesz jakiejś konkretnej metody na jednym z obiektów w parach, będzie lepiej, jeśli utworzysz inną mapę:

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

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

i wtedy

team1.put("United", 5);

team1Keys.put(5, "United");

i pamiętaj, nie komplikuj;)

user3763927
źródło
-3

Aby uzyskać klucz i jego wartość

na przykład

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
                }

Wydrukuje: Klucz: United Wartość: 5 Klucz: Barcelona Wartość: 6

Emmanuel R.
źródło