如何将 Hashmap 中的值转换为 List<String>
Posted
技术标签:
【中文标题】如何将 Hashmap 中的值转换为 List<String>【英文标题】:How to convert Values in a Hashmap to a List<String> 【发布时间】:2016-08-30 20:01:13 【问题描述】:我有一个 Hashmap 类型
Map<String, List<String>> adminErrorMap = new HashMap<>();
我希望能够遍历整个哈希图并将所有值获取到单个 List<String>
。密钥无关紧要。
我做过这样的事情:
List<String> adminValues = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : adminErrorMap.entrySet())
adminValues.add(entry.getValue().toString());
System.out.println(adminValues);
输出
[[description=文件路径,value=PurchaseOrder.plsql, description=组件,value=PURCH,description=提交日期, 值=2016 年 5 月 5 日星期四 00:32:01 IST ],[description=文件路径, value=CustomerOrder.plsql, description=Component, value=COMP, description=Commit Date, value=Thu June 05 00:32:01 IST 2016]]
如您所见,主 [] 中有 []。
如何在一个 [] 中包含所有值。如下图所示;
或者还有其他方法可以实现吗?
[description=文件路径, value=PurchaseOrder.plsql, description=组件,value=PURCH,description=提交日期, value=2016 年 5 月 5 日星期四 00:32:01 IST ,description=文件路径, value=CustomerOrder.plsql, description=Component, value=COMP, description=Commit Date, value=Thu June 05 00:32:01 IST 2016]
【问题讨论】:
不应该是adminValues.add(entry.getKey());
之类的吗?您不能将 List<String>
放入需要 String
的容器中
如果我想要钥匙的话。但我只想要所有键的值
那你为什么将adminValues
声明为List<String>
类型而不是List< List<String> >
?
啊哈!我看你说得有道理!谢谢:)
如果它适合你,我会发布我的评论作为答案
【参考方案1】:
一个简单的方法是:
new ArrayList<>(map.values());
对于 JDK 8 及更高版本,也可以这样做:
map.values().stream().collect(Collectors.toList());
【讨论】:
【参考方案2】:您只需要将集合展平即可。在 Java8 中:
final Map<String, List<String>> adminErrorMap = ImmutableMap.of(
"a", Lists.newArrayList("first", "second"),
"b", Lists.newArrayList("third")
);
final List<String> results = adminErrorMap.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
results.forEach(System.out::println);
打印出来:
first
second
third
【讨论】:
【参考方案3】:我们为什么不这样做
Map<String, List<String>> mapKeyList = new HashMap<String, List<String>>();
List<String> finalList = new ArrayList<String>();
Iterator it = mapKeyList.entrySet().iterator();
while(it.hasNext())
Map.Entry pair = (Map.Entry)it.next();
List<String> strList = (List<String>) pair.getValue();
Iterator<String> strIt= strList.iterator();
while(strIt.hasNext())
String str = strIt.next();
finalList.add(str);
我知道复杂性将是 n*n 的顺序,但我们得到了预期的输出。
【讨论】:
您的代码太长了。从 Java 1.5 开始,Iterator 类只在非常特殊的情况下使用,这不是其中之一。 这段代码对于实际需要来说是不必要的冗长/冗长,而且它的时间复杂度也不是很高。 但如果我们得到预期的输出,那么我认为可以使用这段代码..【参考方案4】:您的声明类型似乎存在问题:
Map<String, List<String>> adminErrorMap = new HashMap<>();
List<String> adminValues = new ArrayList<>();
您的adminValues
期望添加String
对象,但您正尝试将List<String>
类型的对象添加到其中:
for (Map.Entry<String, List<String>> entry : adminErrorMap.entrySet())
adminValues.add(entry.getValue().toString());
entry.getValue()
,基于adminErrorMap
的声明,不返回String
类型的对象。相反,它返回另一个List<String>
,这根本不是预期的。您只是在 List<String>
对象上调用 toString()
,这可能不是您真正想要做的。
由于您不能将List<String>
类型的对象放入需要String
类型的对象的容器中,因此您应该改用entry.getKey()
:
adminValues.add(entry.getKey());
如果我没记错我的 Java,也许以下内容可能更有用:
for (String key : adminErrorMap.keySet())
adminValues.add(key);
编辑此评论:
我只想要所有键的值
由于每个键可以有多个与之关联的值,鉴于它们的类型为List<String>
,那么您应该考虑更接近Eran proposed 的值:
for (List<String> values : adminErrorMap.values())
adminValues.addAll(values);
【讨论】:
【参考方案5】:在 Java8 中,您可以使用函数式来做到这一点:
adminErrorMap.values().forEach(adminValues::addAll);
【讨论】:
【参考方案6】:使用addAll
而不是add
,以便将所有List<String>
s 中的所有String
s 添加到单个List<String>
中:
for (List<String> value : adminErrorMap.values())
adminValues.addAll(value);
【讨论】:
我认为这段代码不正确。似乎没有一个赞成这个答案的人注意到adminValues
是String
对象的容器,不是 List<String>
的容器,即声明不是List< List<String> > adminValues
跨度>
@ray 是正确的。 addAll 接受一个集合并将该集合的所有元素添加到列表中。因此,您调用adminValues.addAll(value);
将value
列表的所有字符串添加到输出List<String>
。
可能是因为我迟到了,但是adminValues
期待String
s被添加,然而value
变量不是String
,而是List<String>
,这就是让我觉得这很奇怪的原因。
@ray 请注意,我使用的是 addAll,而不是 add。 addAll 需要一个与要添加元素的 List 具有相同元素类型的 Collection。因此,您可以调用addAll
获取List<String>
并将另一个List<String>
传递给它。
@ray 这里是the JavaDoc for same以上是关于如何将 Hashmap 中的值转换为 List<String>的主要内容,如果未能解决你的问题,请参考以下文章