206

我在Java中有一个这样的Hashmap:

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

然后我像这样填充它:

team1.put("United", 5);

我怎样才能得到钥匙?类似于:team1.getKey()返回“United”。

4

15 回答 15

365

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

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

1使用 key"foo"2key存储"bar"。遍历所有键:

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

将打印"foo""bar".

于 2012-05-05T14:34:30.233 回答
60

如果您知道索引,这是可行的,至少在理论上是可行的:

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

keySet()返回一个集合,因此您将集合转换为数组。

问题,当然,是一套不承诺保持你的订单。如果您的 HashMap 中只有一项,那很好,但如果您有更多,最好像其他答案一样遍历地图。

于 2015-06-18T18:17:17.093 回答
26

检查这个。

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

(使用java.util.Objects.equals因为 HashMap 可以包含null

使用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> findKey(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> findKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

更“通用”且尽可能安全

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

或者,如果您使用的是 JDK7。

private String findKey(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> findKeys(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;
}
于 2012-05-05T14:36:30.977 回答
7

您可以使用该方法检索所有的Map密钥keySet()。现在,如果你需要的是得到一个给定value的key,那是完全不同的事情,对你没有帮助;您需要一个专门的数据结构,例如(允许在键和值之间双向查找的映射)来自 Apache 的Commons Collections - 还要注意几个不同的键可以映射到相同的值。MapBidiMap

于 2012-05-05T14:35:03.997 回答
2

当您想获得参数(United)时,5您也可以考虑使用双向映射(例如由 Guava 提供:http ://docs.guava-libraries.googlecode.com/git/javadoc/com/google /common/collect/BiMap.html)。

于 2012-05-05T14:37:32.553 回答
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());
                }
于 2013-09-09T17:37:23.637 回答
2

使用函数式操作来加快迭代速度。

team1.keySet().forEach((key) -> {
      System.out.println(key);
});
于 2020-03-02T13:50:27.103 回答
2

foreach 也可以使用。

team1.forEach((key, value) -> System.out.println(key));
于 2021-09-28T09:57:41.370 回答
1

如果您只需要一些简单且更多的验证。

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

然后你可以搜索任何键。

System.out.println( "Does this key exist? : " + getKey("United") );
于 2013-07-24T22:50:42.683 回答
0

一个解决方案是,如果您知道键位置,将键转换为字符串数组并返回该位置的值:

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

    return keys[pos];
}
于 2018-06-10T12:04:22.233 回答
0

要获取 HashMap 中的键,我们有 keySet() 方法,该方法存在于java.util.Hashmap包中。前任 :

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

现在将在地图中提供您所有的键。例如:[key1,key2]

于 2020-06-16T08:15:13.943 回答
-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);
   }    
}
于 2014-08-05T07:53:23.633 回答
-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);
        }
    }
}
于 2015-05-04T09:28:15.673 回答
-2

我要做的非常简单但浪费内存的是用一个键映射值,然后用一个值映射键,使之:

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

记住,保持简单;)

于 2016-03-22T16:50:41.157 回答
-2

获取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 Key: Barcelona Value:6

于 2017-05-06T15:10:16.930 回答