Java 转换集合<;地图入口<;K、 V>&燃气轮机;到HashMap<;K、 V>;

Java 转换集合<;地图入口<;K、 V>&燃气轮机;到HashMap<;K、 V>;,java,map,set,Java,Map,Set,在代码中的某一点上,我从地图创建了一个Set。现在我想重新创建相同的映射表单,因此我想将HashSet转换回HashMap。Java对此是否有本机调用,或者我必须循环集合元素并手动构建映射?Java中没有内置API用于在HashSet和HashMap之间直接转换,您需要迭代集合并使用Entry填充映射 一种方法: Map<Integer, String> map = new HashMap<Integer, String>(); //fill in map

在代码中的某一点上,我从地图创建了一个
Set
。现在我想重新创建相同的映射表单,因此我想将
HashSet
转换回
HashMap
。Java对此是否有本机调用,或者我必须循环集合元素并手动构建映射?

Java中没有内置API用于在
HashSet
HashMap
之间直接转换,您需要迭代集合并使用
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());
    }
Map Map=newhashmap();
//填图
Set=map.entrySet();
Map mapFromSet=新HashMap();
用于(条目:集合)
{
mapFromSet.put(entry.getKey(),entry.getValue());
}
虽然这里的目的是什么,但是如果您在
Set
中做了任何更改,这些更改也会反映在
Map
中,作为
Map返回的Set。entrySet
Map
的备份。请参见下面的
javadoc

Set java.util.Map.entrySet()

返回此映射中包含的映射的集合视图。布景是 由地图支持,因此地图的更改将反映在集合中,并且 反之亦然。如果在集合上进行迭代时修改贴图 正在进行中(通过迭代器自己的删除操作除外,或 通过对 迭代器)迭代的结果未定义。这台电视机支持 元素移除,从映射中移除相应的映射, 通过迭代器.remove、Set.remove、removeAll、retainal和clear 操作。它不支持添加或添加所有操作


相当简短的Java8解决方案。可以处理重复的钥匙

    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));
Map Map=newhashmap();
//填图
Set=map.entrySet();
Map mapFromSet=set.stream().collect(Collectors.toMap)(条目::getKey,
条目::getValue,
(a,b)->b);

编辑:感谢在Java8中使用正确的组合器,比我更值得称赞的人

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;}););
Map Map=newhashmap();
//填图
Set=map.entrySet();
Map mapFromSet=set.stream().collect(HashMap::new,(t,u)->t.put(u.getKey(),u.getValue()),
(地图地图返回、地图其他地图)->
{
otherMap.entrySet().forEach((Map.Entry)->{
mapToReturn.put(entry.getKey(),entry.getValue());
});
返回mapToReturn;}););

更简单的Java-8解决方案,包括
收集器。toMap

Map<Integer, String> mapFromSet = set.stream()
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Map mapFromSet=set.stream()
.collect(Collectors.toMap(条目::getKey,条目::getValue));

如果遇到重复的密钥,将抛出一个
IllegalStateException

从Guava 19开始,您可以使用这些是常见库中的一些
toMap
实用程序,但不幸的是,它们都不支持直接设置
所以您需要首先执行。(我遗漏了可以说是最好的)

朗公地酒店
Map Map=ArrayUtils.toMap(entrySet.toArray());
//要恢复类型。。。
@抑制警告(“未选中”)
地图类型地图=(地图)(地图)地图;
共同收藏'
Map-Map=MapUtils.putAll(新的HashMap(),entrySet.toArray());
Java 9的
//转换为数组并恢复类型。。。
@抑制警告(“未选中”)
Map Map=Map.ofEntries(entrySet.toArray(newmap.Entry[0]);
//如果你想要一个可变的,你需要再复制一次
Map hashmap=新hashmap(Map);
Java 9+无抑制警告 在Java9版本中,集合接口提供了一系列方便的静态方法,允许您内联完成许多事情。有一个内置的解决方案,使用静态方法创建一个不可变的映射

Map<Integer,String> map = Map.ofEntries(
        new SimpleEntry<>(1, "one"), 
        new SimpleEntry<>(2, "two"), 
        new SimpleEntry<>(3, "three"));
假设您已设置了
,则需要一个数组才能使用方法。由于禁止创建泛型数组,因此需要显式强制转换,这是此解决方案的唯一缺点

Set<Map.Entry<Integer,String>> set = ...
Entry<Integer, String>[] entries = set.<Entry<Integer,String>>toArray(Entry[]::new);
Map<Integer,String> map = Map.ofEntries(entries);
为避免出现字典中禁止的两个键相同的
Map.Entry
,请使用。返回
first
second
,具体取决于要保留为某个键找到的第一个值还是最新的值

Map<Integer,String> map = set.stream().collect(Collectors.toMap(
        Entry::getKey, 
        Entry::getValue, 
        (first, second) -> first));   // or '-> second' if you need the latests
Map Map=set.stream().collect(Collectors.toMap(
条目::getKey,
条目::getValue,
(第一,第二)->第一);//如果需要最晚的,也可以使用'->second'
Java 7及更高版本
您所能做的就是按照说明为每个迭代创建一个过程。

您是如何使用键、值或自定义逻辑从
Map
创建
Set
?此外,对于
HashSet
HashMap
没有
native
方法。您需要迭代并使用一些逻辑,就像在放入
HashMap
时如何选择键和值一样。@Paul Thank now这个问题清楚地表明了senseI不认为
Map。Entry
就是这样使用的。例如,
HashMap
使用的实现是否覆盖了
hashCode
是否等于
?一组映射。条目是一个映射(逻辑上)。TreeSet/HashSet的实现是使用树/哈希映射来备份集合。意思集.add(X)=Map.put(X,随便什么);不会。您的双消费者不会组合映射。在上面的代码中,从未调用双消费者的accept方法。我本希望使用null,但在这种情况下collect方法愚蠢地抛出了一个NPE。@mikeyreilly没有明确地说组合器从未为顺序流调用过。因此,您违反了方法的约定。@TagirValeev一个公平的观点,但我宁愿违反约定,也不愿编写不起任何作用的代码。您可以同样轻松地使用
收集器。toMap(Entry::getKey,Entry::getValue,(A,b)->b)
。如果有任何值为null,NPEs怎么办?
Set<Map.Entry<Integer,String>> set = ...
Map<Integer,String> map = set.stream()
                             .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Map<Integer,String> map = set.stream().collect(Collectors.toMap(
        Entry::getKey, 
        Entry::getValue, 
        (first, second) -> first));   // or '-> second' if you need the latests