java - keyset和entryset - 将<Map.Entry<K,V>>转换为HashMap<K,V>




map keyset (4)

java中没有内置的API用于HashSetHashMap之间的直接转换,您需要遍历set和使用Entry填充地图。

一种方法:

Map<Integer, String> map = new HashMap<Integer, String>();
    //fill in map
    Set<Entry<Integer, String>> set = map.entrySet();

    Map<Integer, String> mapFromSet = new HashMap<Integer, String>();
    for(Entry<Integer, String> entry : set)
    {
        mapFromSet.put(entry.getKey(), entry.getValue());
    }

虽然这里的目的是什么,但是如果你在Set中做了任何改变,那Map.entrySet返回的Map也会反映在Map 。 见下面的javadoc

设置<Entry <Integer,String >> java.util.Map.entrySet()

返回此映射中映射的映射的Set视图。 该集合由地图支持,所以对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改了映射(除了通过迭代器自己的删除操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。 该集支持元素删除,通过Iterator.remove,Set.remove,removeAll,retainAll和Clear操作从映射中删除相应的映射。 它不支持add或addAll操作。

在我的代码中,我从地图创建了一个Set<Map.Entry<K, V>> 。 现在我想重新创建相同的地图表单,所以我想将HashSet<Map.Entry<K, V>>HashMap<K, V> 。 Java有一个本地调用这样做,或者我必须循环设置元素,并手动建立地图?


在Java 8中使用正确的组合器

Map<Integer, String> map = new HashMap<>();
//fill in map
Set<Map.Entry<Integer, String>> set = map.entrySet();

Map<Integer, String> mapFromSet =set.stream().collect(HashMap::new,(t, u) -> t.put(u.getKey(), u.getValue()), 
(Map mapToReturn, Map otherMap) ->
    {
        otherMap.entrySet().forEach((Map.Entry entry) -> {
            mapToReturn.put(entry.getKey(),entry.getValue());
        });
        return mapToReturn;}););

相当短的Java 8解决方案。 可以处理重复的密钥。

    Map<Integer, String> map = new HashMap<>();
    //fill in map
    Set<Map.Entry<Integer, String>> set = map.entrySet();
    Map<Integer, String> mapFromSet = set.stream().collect(Collectors.toMap(Entry::getKey,
      Entry::getValue,
      (a,b)->b));

编辑:谢谢Shossel谁应得到更多的信贷比我这样做






set