2012-05-05 2 views
96

У меня есть HashMap в Java, как это:Получить ключи от HashMap в Java

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

Тогда я заполнить это следующим образом:

team1.put("United", 5); 

Как я могу получить ключи? Что-то вроде: team1.getKey(), чтобы вернуть «Юнайтед».

+8

Карта содержит несколько ключей. Это словарь. Ваш вопрос не имеет смысла. –

+0

Что вы ожидаете от команды team1.getKey() ', если: (1) карта пуста или (2) если она содержит несколько ключей? – NPE

+0

'int' следует использовать для одиночных подобных. –

ответ

205

A HashMap содержит более одного ключа. Вы можете использовать keySet(), чтобы получить набор всех ключей.

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

будет хранить 1 с ключом "foo" и 2 с ключом "bar". Для перебора всех ключей:

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

напечатает "foo" и "bar".

+0

Но в этом случае у меня есть только один ключ для каждого значения. Невозможно написать что-нибудь вроде team1.getKey()? – masb

+0

Нет, у вас есть карта с одним элементом. Но это карта: структура, которая может содержать более одного элемента. – Matteo

+10

Что такое карта с одним ключом? Создайте класс с ключевым полем и полем значений. –

5

Вы можете получить все ключи Map, используя метод keySet(). Теперь, если вам нужно получить ключ, учитывая его значение , это совсем другое дело, и Map вам не помогут; вам понадобится специализированная структура данных, например BidiMap (карта, которая позволяет двунаправленный поиск между ключом и значениями) от Commons Collections от Apache. Также имейте в виду, что несколько разных ключей могут быть сопоставлены с одним и тем же значением.

18

Проверьте это.

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

Если предположить, что у вас есть различное значение для каждого ключа, вы можете сделать что-то вроде этого:

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

Или, если вы не можете предположить, что каждый ключ имеет значение 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; 
} 

Или с помощью 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

Но что произойдет, если несколько ключей соответствуют одному значению? вы должны возвращать список ключей вместо –

0

Если вам просто нужно что-то простое и более проверочное.

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

Тогда вы можете найти любую клавишу.

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

Попробуйте эту простую программу:

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

Просто копирует существующие ответы. -1 –

26

Это выполнимо, по крайней мере в теории, если вы знаете индекс:

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

keySet() возвращает список, поэтому вы конвертируете список в массив.

Проблема, конечно же, в том, что комплект не обещает сохранить ваш заказ. Если у вас есть только один элемент в HashMap, вы добры, но если у вас есть больше, лучше всего перебирать карту, как это сделали другие ответы.

+0

Помог мне тоже :) – sTg

-2

Что я буду делать что очень простой, но память отходов для отображения значений с помощью ключа и сделать на противоположном картировать ключи значение делает это:

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

это важно вы используете <Object, Object>, так что вы можете отобразить keys:Value и Value:Keys как этот

team1.put("United", 5);

team1.put(5, "United");

Так что, если вы используете team1.get("United") = 5 и team1.get(5) = "United"

Но если вы используете какой-то конкретный метод на одном из объектов в парах, я бы лучше, если вы сделаете другую карту:

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

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

, а затем

team1.put("United", 5);

team1Keys.put(5, "United");

и помните, что держать его просто;)

-1

Чтобы получить Key и его значение

например

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 
       } 

Напечатает: Key: United Value: 5 Ключевые слова: Barcelona Значение: 6

Смежные вопросы