如何将Hashmap中的值转换为List <string>

时间:2016-05-05 06:18:06

标签: java hashmap

我有一个类型为

的Hashmap
Map<String, List<String>> adminErrorMap = new HashMap<>();

我希望能够通过整个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 = File Path,   value = CustomerOrder.plsql},{description = Component,value = COMP},   {description =提交日期,价值=星期六06月05日00:32:01 IST 2016}]]

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

如何在一个[]中包含所有值。如下图所示;

或者还有其他方法可以实现吗?

  

[{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 =提交日期,价值=星期六06月05日00:32:01 IST 2016}]

6 个答案:

答案 0 :(得分:11)

使用addAll代替add,以便将所有String的所有List<String>添加到单个List<String>中:

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

答案 1 :(得分:6)

在Java8中,您可以使用功能来执行此操作:

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

答案 2 :(得分:1)

您的申报类型似乎存在问题:

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>,这根本不是预期的。你只是在toString()对象上调用List<String>,这可能不是你真正想要做的。

由于您无法将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);

答案 3 :(得分:1)

你只需要展平整个系列。在Java8中:

<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
  <dpiAware>true</dpiAware>
</asmv3:windowsSettings>

打印:

    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);

答案 4 :(得分:1)

简单的方法是:

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

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

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

答案 5 :(得分:0)

为什么我们不这样做

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 的顺序,但我们正在获得预期的输出。