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