【问题标题】:How to convert Values in a Hashmap to a List<String>如何将 Hashmap 中的值转换为 List<String>
【发布时间】:2016-08-30 20:01:13
【问题描述】:

我有一个 Hashmap 类型

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

我希望能够遍历整个哈希图并将所有值获取到单个 List&lt;String&gt;。密钥无关紧要。

我做过这样的事情:

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&lt;String&gt; 放入需要 String 的容器中
  • 如果我想要钥匙的话。但我只想要所有键的值
  • 那你为什么将adminValues 声明为List&lt;String&gt; 类型而不是List&lt; List&lt;String&gt; &gt;
  • 啊哈!我看你说得有道理!谢谢:)
  • 如果它适合你,我会发布我的评论作为答案

标签: java hashmap


【解决方案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&lt;String&gt; 类型的对象添加到其中:

      for (Map.Entry<String, List<String>> entry : adminErrorMap.entrySet())               
          adminValues.add(entry.getValue().toString());
      

      entry.getValue(),基于adminErrorMap 的声明,返回String 类型的对象。相反,它返回另一个List&lt;String&gt;,这根本不是预期的。您只是在 List&lt;String&gt; 对象上调用 toString(),这可能不是您真正想要做的。

      由于您不能将List&lt;String&gt; 类型的对象放入需要String 类型的对象的容器中,因此您应该改用entry.getKey()

      adminValues.add(entry.getKey());
      

      如果我没记错我的 Java,也许以下内容可能更有用:

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

      编辑此评论:

      我只想要所有键的值

      由于每个键可以有多个与之关联的值,鉴于它们的类型为List&lt;String&gt;,那么您应该考虑更接近Eran proposed 的值:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          使用addAll 而不是add,以便将所有List&lt;String&gt;s 中的所有Strings 添加到单个List&lt;String&gt; 中:

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

          【讨论】:

          • 我认为这段代码不正确。似乎没有一个赞成这个答案的人注意到adminValuesString 对象的容器,不是 List&lt;String&gt; 的容器,即声明不是List&lt; List&lt;String&gt; &gt; adminValues跨度>
          • @ray 是正确的。 addAll 接受一个集合并将该集合的所有元素添加到列表中。因此,您调用adminValues.addAll(value);value 列表的所有字符串添加到输出List&lt;String&gt;
          • 可能是因为我迟到了,但是adminValues期待Strings被添加,然而value变量不是String,而是List&lt;String&gt;,这就是让我觉得这很奇怪的原因。
          • @ray 请注意,我使用的是 addAll,而不是 add。 addAll 需要一个与要添加元素的 List 具有相同元素类型的 Collection。因此,您可以调用addAll 获取List&lt;String&gt; 并将另一个List&lt;String&gt; 传递给它。
          • @ray 这里是the JavaDoc for same
          猜你喜欢
          • 2015-09-28
          • 1970-01-01
          • 1970-01-01
          • 2016-06-27
          • 1970-01-01
          • 2018-11-26
          • 2011-07-24
          • 2018-07-16
          • 1970-01-01
          相关资源
          最近更新 更多