Holen Sie sich Schlüssel von HashMap in Java

166

Ich habe eine Hashmap in Java wie folgt:

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

Dann fülle ich es so:

team1.put("United", 5);

Wie kann ich die Schlüssel bekommen? So etwas wie team1.getKey()"United" zurückzugeben.

masb
quelle
Was erwarten Sie team1.getKey(), wenn: (1) die Karte leer ist oder (2) wenn sie mehrere Schlüssel enthält?
NPE
intsollte für solche wie diese verwendet werden.
Stommestack

Antworten:

313

A HashMapenthält mehr als einen Schlüssel. Sie können verwenden keySet(), um den Satz aller Schlüssel zu erhalten.

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

wird 1mit Schlüssel "foo"und 2mit Schlüssel gespeichert "bar". So durchlaufen Sie alle Schlüssel:

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

druckt "foo"und "bar".

Matteo
quelle
Aber in diesem Fall habe ich nur einen Schlüssel für jeden Wert. Es ist nicht möglich, so etwas wie team1.getKey () zu schreiben?
Masb
Nein, Sie haben eine Karte mit einem Element. Aber es ist eine Karte: eine Struktur, die mehr als ein Element enthalten kann.
Matteo
13
Was bringt eine Karte mit einem einzigen Schlüssel? Erstellen Sie eine Klasse mit einem Schlüsselfeld und einem Wertefeld.
JB Nizet
Ich habe mein Problem falsch verstanden. Danke für deine Antworten.
Masb
3
Wenn Sie alle Schlüssel in der Array-Liste List<String> keys = new ArrayList<>(mLoginMap.keySet());
speichern möchten
50

Dies ist zumindest theoretisch möglich, wenn Sie den Index kennen:

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

keySet() Gibt eine Menge zurück, sodass Sie die Menge in ein Array konvertieren.

Das Problem ist natürlich, dass ein Set nicht verspricht, Ihre Bestellung zu behalten. Wenn Sie nur ein Element in Ihrer HashMap haben, sind Sie gut, aber wenn Sie mehr als das haben, ist es am besten, die Karte zu durchlaufen, wie es andere Antworten getan haben.

james.garriss
quelle
Dies ist hilfreich in einem Unit-Test-Szenario, in dem Sie die volle Kontrolle über den Inhalt Ihres Geräts haben HashMap. Gute Show.
RisingTide
Nichts über das Kennen des Index in der Frage.
Marquis von Lorne
23

Überprüfen Sie dies.

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

(Verwenden Sie, java.util.Objects.equalsweil HashMap enthalten kann null)

Verwenden von 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());
}

"Generischer" und so sicher wie möglich

/**
 * 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());
}

Oder wenn Sie auf JDK7 sind.

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.
quelle
2
Aber was passiert, wenn mehrere Schlüssel demselben Wert zugeordnet sind? Sie sollten stattdessen eine Liste der Schlüssel zurückgeben
Óscar López
@ ÓscarLópez Sie können nicht. HashMapSchlüssel sind einzigartig.
Marquis von Lorne
6

MapMit der Methode können Sie alle Schlüssel abrufen keySet(). Wenn Sie nun einen Schlüssel aufgrund seines Werts benötigen, ist das eine ganz andere Sache und Maphilft Ihnen dort nicht weiter. Sie benötigen eine spezielle Datenstruktur wie BidiMap(eine Karte, die eine bidirektionale Suche zwischen Schlüssel und Werten ermöglicht) aus Apaches Commons-Sammlungen. Beachten Sie auch, dass mehrere verschiedene Schlüssel demselben Wert zugeordnet werden können.

Óscar López
quelle
1

Wenn Sie nur etwas Einfaches und eher eine Überprüfung benötigen.

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

Dann können Sie nach einem beliebigen Schlüssel suchen.

System.out.println( "Does this key exist? : " + getKey("United") );
tzg
quelle
1
Diese Methode ist völlig redundant.
Marquis von 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
quelle
Funktioniert nicht Offensichtlich hast du es nicht versucht. Wenn Sie next()zweimal in der Schleife aufrufen, werden die ungeradzahligen Tasten zusammen mit den geradzahligen Werten gedruckt.
Marquis von Lorne
0

Verwenden Sie die Funktionsoperation für eine schnellere Iteration.

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

eCuzzy
quelle
-1

Eine Lösung kann sein, wenn Sie die Schlüsselposition kennen, die Schlüssel in ein String-Array zu konvertieren und den Wert an der Position zurückzugeben:

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

    return keys[pos];
}
Orici
quelle
Nichts über das Kennen des Index in der Frage.
Marquis von Lorne
-2

Probieren Sie dieses einfache Programm aus:

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
quelle
-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
quelle
Kopiert lediglich vorhandene Antworten. -1
james.garriss
-2

Um Schlüssel in HashMap zu erhalten, haben wir die keySet () -Methode, die im java.util.HashmapPaket vorhanden ist. Ex :

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();

Jetzt Tasten werden alle Ihre Schlüssel in der Karte zur Verfügung haben. Beispiel: [Schlüssel1, Schlüssel2]

Ghanshyam Singh
quelle
java,util.HashMapist eine Klasse, kein Paket, und hier gibt es nichts, was vor fünf Jahren noch nicht hier war.
Marquis von Lorne
-3

Was ich tun werde, ist sehr einfach, aber Speicherverschwendung besteht darin, die Werte mit einem Schlüssel abzubilden und das Gegenteil zu tun, um die Schlüssel mit einem Wert abzubilden, der Folgendes ergibt:

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

Es ist wichtig, dass Sie verwenden, <Object, Object>damit Sie dies abbilden keys:Valueund Value:Keysmögen können

team1.put("United", 5);

team1.put(5, "United");

Also, wenn Sie team1.get("United") = 5und verwendenteam1.get(5) = "United"

Wenn Sie jedoch eine bestimmte Methode für eines der Objekte in den Paaren verwenden, ist es besser, wenn Sie eine andere Karte erstellen:

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

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

und dann

team1.put("United", 5);

team1Keys.put(5, "United");

und denk dran, halte es einfach;)

user3763927
quelle
-3

Um Schlüssel und seinen Wert

z.B

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
                }

Wird gedruckt: Schlüssel: United Wert: 5 Schlüssel: Barcelona Wert: 6

Emmanuel R.
quelle