繁体   English   中英

如何将 Hashmap 中的值转换为列表<String>

[英]How to convert Values in a Hashmap to a List<String>

我有一个类型的 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=File Path, value=PurchaseOrder.plsql}, {description=Component, value=PURCH}, {description=Commit Date, value=Thu May 05 00:32:01 IST 2016}],[{description=文件路径,value=CustomerOrder.plsql},{description=Component,value=COMP},{description=Commit Date,value=Thu June 05 00:32:01 IST 2016}]]

如您所见,主 [] 中有 []。

如何将所有值都放在一个 [] 中。 如下图所示;

或者有没有其他方法可以实现这一点?

[{description=File Path, value=PurchaseOrder.plsql}, {description=Component, value=PURCH}, {description=Commit Date, value=Thu May 05 00:32:01 IST 2016},{description=File Path, value=CustomerOrder.plsql}, {description=Component, value=COMP}, {description=Commit Date, value=Thu June 05 00:32:01 IST 2016}]

使用addAll而不是add ,以便将所有List<String>的所有String添加到单个List<String>

for (List<String> value : adminErrorMap.values())   
{                
     adminValues.addAll(value);
}

在 Java8 中,您可以使用函数来做到这一点:

adminErrorMap.values().forEach(adminValues::addAll);

一个简单的方法是:

new ArrayList<>(map.values());

对于 JDK 8 及更高版本,这也可以通过以下方式完成:

map.values().stream().collect(Collectors.toList());

您只需要展平集合。 在 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

您的声明类型似乎存在问题:

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> -typed对象到一个容器,期待String -typed对象,你应该使用entry.getKey()代替:

adminValues.add(entry.getKey());

如果我正确地回忆我的 Java,以下内容可能更有用:

for (String key : adminErrorMap.keySet())
    adminValues.add(key);

编辑此评论:

我只想要所有键的值

由于每个键可以有多个与之关联的值,鉴于它们的类型为List<String> ,那么您应该考虑更接近Eran 提出的内容

for (List<String> values : adminErrorMap.values())               
    adminValues.addAll(values);

我们为什么不这样做

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 的顺序排列,但我们得到了预期的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM