从Java中的HashMap获取密钥


166

我在Java中有一个Hashmap,如下所示:

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

然后我像这样填充它:

team1.put("United", 5);

如何获得钥匙?类似于:team1.getKey()返回“ United”。


team1.getKey()如果:(1)映射为空,或者(2)包含多个键,您期望返回什么?
NPE 2012年

int应该用于这样的单身。
stommestack 2014年

Answers:


312

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

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

将存储1key "foo"2key "bar"。要遍历所有键:

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

将打印"foo""bar"


但是在这种情况下,每个值我只有一个键。无法编写像team1.getKey()这样的东西?
Masb 2012年

不,您有一个只有一个元素的地图。但这是一张地图:可以包含多个元素的结构。
Matteo

13
单键地图的意义何在?创建一个具有键字段和值字段的类。
JB Nizet

我误解了我的问题。感谢您的回答。
Masb 2012年

3
如果要将所有键存储在数组列表中:List<String> keys = new ArrayList<>(mLoginMap.keySet());
Pratik Butani

50

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

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

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

当然,问题在于设备集不能保证您的订单。如果您的HashMap中只有一项,那您就很好,但是如果您有更多的话,那么最好遍历地图,就像其他答案一样。


在单元测试场景中,这对您有完全控制权的内容很有帮助HashMap。不错的演出。
上升潮

完全不知道问题中的索引。
洛恩侯爵

23

检查一下。

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

更“通用”且尽可能安全

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

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

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
但是,如果几个键映射到相同的值会发生什么?你应该返回键的列表,而不是
奥斯卡·洛佩斯

@ÓscarLópez他们不能。HashMap键是唯一的。
洛恩侯爵,

6

您可以Map使用方法检索所有的键keySet()。现在,如果你需要的是获得一个关键的考虑到其价值,这是一个完全不同的问题,并Map不会帮助你那里。您需要一个特殊的数据结构,例如BidiMap(来自Apache的Commons Collections的映射(允许在键和值之间进行双向查找)的映射)-还应注意,可以将多个不同的键映射到相同的值。



1

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

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

然后,您可以搜索任何键。

System.out.println( "Does this key exist? : " + getKey("United") );

1
这种方法是完全多余的。
洛恩侯爵,

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

不起作用 显然您还没有尝试过。next()在循环中调用两次意味着您将打印奇数键和偶数值。
洛恩侯爵,

0

使用函数运算可加快迭代速度。

team1.keySet().forEach((key) -> { System.out.println(key); });


-1

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

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

    return keys[pos];
}

完全不知道问题中的索引。
洛恩侯爵

-2

试试这个简单的程序:

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

仅复制现有答案。-1
james.garriss

-2

为了在HashMap中获取密钥,我们在java.util.Hashmap包中提供了keySet()方法。例如:

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]


java,util.HashMap是一个类,而不是一个包,这里没有五年前没有的东西。
罗恩侯爵

-3

我要做的很简单,但浪费内存的是用键映射值,而相反地用值映射键,这使得:

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

并记住,保持简单;)


-3

获取密钥及其价值

例如

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.