Java:将HashMap值转换为Set<Integer>

11

关于Java中的HashMap<>还有一个问题:

我有以下代码:

Map<String, Set<Integer>> myWordDict = new HashMap<String, Set<Integer>>();

将数据存储到变量myWordDict后,我想遍历HashMap的值,并将每个值添加到一个新的Set变量中?

当我尝试执行Set<Integer> newVariable = myWordDict.entrySet()时,似乎数据类型不兼容。

所以我的问题本质上是:

如何将HashMap的值或entrySet()转换为Set

谢谢


4
地图值类型是什么? - Chowdappa
你想要所有的键值组合作为一个集合吗?还是只想要键或值? - Rahul
我希望只有Set<Integer>中的值。该值类型为Integer。 - TonyGW
@TonyGW 你说值类型是整数,但在上面的例子中,实际上值类型是Set<Integer>。 - ApproachingDarknessFish
是的,该值是Set<Integer>。对于混淆表示抱歉。 - TonyGW
你能接受解决了你问题的答案或者提供你采用的解决方案吗? - r0estir0bbe
9个回答

24

尝试:

Set<Integer> newVariable = mywordDict.keySet();
Set<Integer> newVariable = new HashSet<Integer>(myWordDict.values());

11

你的声明应该像下面这样。它将把你的地图值转换为Collection

  Collection<Set<Integer>> newVariable = myWordDict.values();

2
你确定这会起作用吗?首先,你必须进行强制类型转换,即使你这样做了,它也会抛出“ClassCastException”。 - Rahul

5
< p > entrySet方法返回什么?

public Set<Map.Entry<K,V>> entrySet()

返回此映射中包含的映射的Set视图。该Set由映射支持,因此对映射的更改会反映在Set中,反之亦然。
如果您想遍历myWordDict哈希表,则只需
for(Map.Entry<String, Set<Integer>> entry : myWordDict.entrySet())
{
   Set<Integer> newVariable = entry.getValue();
}

相关链接


我现在正在使用迭代器来遍历HashMap的值: - TonyGW

4
如果您需要将所有值作为整数Set而不是SetSet,则可以像这样操作。
Set<Integer> newVariable = new HashSet<Integer>();
for (Set<Integer> set : myWordDict.values()) {
    newVariable.addAll(set);
}

如果您想将它们作为SetSet,您需要像这样操作。
Set<Set<Integer>> newVariable = new HashSet<Set<Integer>>();
newVariable.addAll(myWordDict.values());

3

flatMap能帮助你:

myWordDict.values().stream().flatMap(Set::stream).collect(Collectors.toSet());

1
Map<Integer,String>   map1 = new HashMap<Integer,String>();

map1.put(1, "Rakesh");
map1.put(2, "Amal");
map1.put(3, "Nithish");

Set<Entry<Integer,String>> set1 = map1.entrySet();

1
假设您想将映射中所有集合的值相加,您可以使用addAll方法进行操作:
Set<Integer> newVariable = new HashSet<Integer>();
for (Set<Integer> set : myWordDict.values()) {
    newVariable.addAll(set);
}

@TonyGW 它根据你的 myWordDict 条目数量运行 - 如果你有10个条目,for 循环将进行10次迭代。 - aga

1
使用myWordDict.values(),而不是myWordDict.entrySet()。values是映射的值的集合,而entrySet是其映射的集合(它是java.util.map.Entry对象的集合,每个对象描述一个键和一个值)。

values() 是 Collections 类型的,因此除非我进行一个丑陋的转换,否则也会存在数据不兼容的问题。 - TonyGW
据我所知,除非您想手动添加每个条目集中的每个值来构建集合,否则没有其他方法可以解决这个问题。@TonyGW - ApproachingDarknessFish

0

所以,我想出了一个迭代器来遍历值集合

我有这个数据结构

Map<String, Set<Integer>> myWordDict = new HashMap<String, Set<Integer>>();

我创建了

Iterator mapIterator = myWordDict.entrySet().iterator();

然后只需使用while()循环将单个值添加到新的Set变量中。我不确定这是否是最有效的方法,但它适合我的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接