Ich habe eine Hashmap in Java wie folgt:
private Map<String, Integer> team1 = new HashMap<String, Integer>();
Dann fülle ich es so aus:
team1.put("United", 5);
Wie kann ich die Schlüssel bekommen? So etwas wie: team1.getKey()
um "United" zurückzugeben.
Ein HashMap
enthält mehr als einen Schlüssel. Sie können keySet()
verwenden, um den Satz aller Tasten abzurufen.
team1.put("foo", 1);
team1.put("bar", 2);
speichert 1
mit der Taste "foo"
und 2
mit der Taste "bar"
. So durchlaufen Sie alle Schlüssel:
for ( String key : team1.keySet() ) {
System.out.println( key );
}
druckt "foo"
und "bar"
.
Dies ist zumindest theoretisch machbar, wenn Sie kennen den Index:
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 aufrechtzuerhalten. 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.
Überprüfen Sie dies.
https://docs.Oracle.com/javase/8/docs/api/Java/util/HashMap.html
(Verwenden Sie Java.util.Objects.equals
, da HashMap null
enthalten kann.)
Verwendung 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());
}
Mehr "generisch" 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;
}
Sie können alle Schlüssel der Map
mit der Methode keySet()
abrufen. Wenn Sie nun einen Schlüssel mit seinem Wert erhalten möchten , das ist eine ganz andere Sache und Map
wird dir da nicht weiterhelfen; Sie benötigen eine spezielle Datenstruktur wie BidiMap
(eine Karte, die eine bidirektionale Suche zwischen Schlüssel und Werten ermöglicht) aus Apaches Commons Collections - Sie müssen sich auch darüber im Klaren sein, dass mehrere verschiedene Schlüssel möglich sind auf den gleichen Wert abgebildet werden.
Wenn Sie nur etwas Einfaches und mehr von einer Ü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") );
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());
}
Da Sie ein Argument (United
) für den angegebenen Wert erhalten möchten (5
), können Sie auch die Verwendung einer bidirektionalen Karte in Betracht ziehen (z. B. bereitgestellt von Guava: http: //docs.guava) -libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html ).
Eine Lösung kann sein, wenn Sie die Schlüsselposition kennen, die Schlüssel in ein String-Array umzuwandeln 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];
}