2012-05-05 119 views
96

我有这样的在Java中一个HashMap:获取密钥在Java中

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

然后我填满它是这样的:

team1.put("United", 5); 

我怎样才能拿到钥匙?例如:team1.getKey()返回“United”。

+8

地图包含几个键。这是一本字典。你的问题没有意义。 –

+0

如果:(1)地图是空的,或者(2)它包含多个键,你期望'team1.getKey()'返回什么? – NPE

+0

'int'应该用于这样的单个元素。 –

回答

205

A HashMap包含多个键。您可以使用keySet()来获取所有密钥的集合。

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

将与关键"foo"2存储1与关键"bar"。遍历所有的键:

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

将打印"foo""bar"

+0

但在这种情况下,我只有一个键每个值。不可能写出类似team1.getKey()的东西吗? – masb

+0

不,你有一个元素的地图。但它是一张地图:一个可以包含多个元素的结构。 – Matteo

+10

使用单个键的地图有什么意义?用关键字段和值字段创建一个类。 –

5

您可以使用方法keySet()检索所有Map的密钥。现在,如果你需要的是获得密钥给定其,这是一个完全不同的问题和Map不会帮助你在那里;你需要一个专门的数据结构,例如BidiMap(一个允许在key的值和值之间进行双向查找的映射),从Apache的Commons Collections也可以知道,几个不同的键可以映射到相同的值。

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

我要做的,这是非常简单的,但浪费内存的值一键映射并做oposite与价值使这个按键映射:

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

是很重要的您使用<Object, Object>这样你就可以映射keys:ValueValue:Keys这样

team1.put("United", 5);

team1.put(5, "United");

所以如果你使用team1.get("United") = 5team1.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

为了得到重点及其价值

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 
       } 

会打印:重点:联合价值:5 注:巴塞罗那价值:6