【问题标题】:Finding number of values in a HashMap?在 HashMap 中查找值的数量?
【发布时间】:2016-06-29 19:48:53
【问题描述】:

HashMap 中查找 总数的最佳/最有效方法是什么。

我不是指 .size() 方法,因为它计算键的数量。我想要所有键中的 values 总数。

我想这样做,因为我的密钥是 String,但我的值是 List

【问题讨论】:

  • 既然在 Java Mapkeyvalue 之间存在 1:1 的关系,也许你应该解释一下为什么 .size()方法不够。
  • 但是 Map 中的值的数量等于该映射中的键的数量。这些值是什么类型的?
  • 请看我的编辑,值是一个列表
  • 你的价值观是什么类型的?如果您的 HashMap 是 则它​​是 1:1 映射。如果您的 HashMap 是 LinkedList 类型,那么值将多于键
  • 然后你需要迭代entrySet并将Lists的size加在一起。 Map 可以包含任何类型的Object,而List一个 Object

标签: java dictionary hashmap


【解决方案1】:

假设你有一张地图

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

您可以通过调用values() 方法并为所有列表调用size() 方法来做到这一点:

int total = 0;
Collection<List<Object>> listOfValues = map.values();
for (List<Object> oneList : listOfValues) {
    total += oneList.size();
}

【讨论】:

    【解决方案2】:

    最简单的方法是迭代和添加列表大小。

    int total = 0;
    for (List<Foo> l : map.values()) {
        total += l.size();
    }
    
    // here is the total values size
    

    【讨论】:

    • 按预期工作:)
    【解决方案3】:

    如果我正确理解了这个问题,您有一个Map&lt;String, List&lt;Something&gt;&gt;,并且您想计算Map 值中所有Lists 中的项目总数。 Java 8 提供了一种非常简单的方法,通过流式传输值,将它们映射到它们的 size(),然后将它们相加:

    Map<String, List<Something>> map = ...;
    int totalSize = map.values().stream().mapToInt(List::size).sum());
    

    【讨论】:

    • @MuddassirRahman 是的,它适用于任何Collection。只需将方法引用List::size 更改为Collection::size
    • 工作正常,但需要更高版本
    【解决方案4】:

    在 Java 8 中,您还可以使用 Stream API:

    int total = map.values()
                   .stream()
                   .mapToInt(List::size) // or (l -> l.size())
                   .sum()
    

    这样做的好处是您不必像在 Java 8 之前的解决方案中那样为 for 变量重复 List&lt;Foo&gt; 类型:

    int total = 0;
    for (List<Foo> list : map.values())
    {
        total += list.size();
    }
    System.out.println(total);
    

    除此之外,虽然不建议这样做,但您也可以在不需要临时变量的情况下内联使用该值:

    System.out.println(map.values().stream().mapToInt(List::size).sum());
    

    【讨论】:

      【解决方案5】:

      从 Java 8 开始,给定 Map&lt;K, List&lt;V&gt;&gt; map,您可以使用 Stream API 并拥有:

      int size = map.values().stream().mapToInt(List::size).sum();
      

      这将使用stream() 创建值的Stream,并使用mapToInt 将每个值映射到它们的大小,其中映射器是方法引用List::size 引用List#size(),并将结果与sum().

      【讨论】:

        【解决方案6】:

        使用Eclipse Collections,以下将使用MutableMap

        MutableMap<String, List<String>> map = 
                Maps.mutable.of("key1", Lists.mutable.of("a", "b", "c"),
                                "key2", Lists.mutable.of("d", "e", "f", "g"));
        
        long total = map.sumOfInt(List::size);
        

        注意:我是 Eclipse Collections 的提交者。

        【讨论】:

          【解决方案7】:
          import java.util.HashMap;
          public class Solution {  
              public static void main(String args[]) {
                  int total = 0;
                  HashMap<String,String> a = new HashMap<String,String>();
                  a.put("1.","1");
                  a.put("2.","11");
                  a.put("3.","21");
                  a.put("4.","1211");
                  a.put("5.","111221");          
                  for (String l : a.values()) {
                      total ++;
                  }
                  System.out.println(total);       
              }
          }
          

          【讨论】:

          • 欢迎来到 Stack Overflow @Mostafa Hussien。也许您想参加现场参观:stackoverflow.com/tour。关于您的回答,请注意问题指定值的类型是列表。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-10
          • 2018-01-18
          • 2021-05-31
          • 1970-01-01
          • 2016-01-23
          • 2023-03-09
          • 1970-01-01
          相关资源
          最近更新 更多