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.


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".


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.


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

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.



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

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

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


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

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

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

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]


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


-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.