【问题标题】:Get all size of values in a HashMap<String,List<String,String>>获取 HashMap<String,List<String,String>> 中所有值的大小
【发布时间】:2018-10-20 16:56:16
【问题描述】:

在我的 HashMap > 中,我保存了键(建筑物的名称)和值(来自该建筑物中设备的 ID)。 我只想从我的 HashMap 中的每个键中获取值的大小,但我得到的唯一大小是来自第一个 Key,Value 对...这是我的代码

    Map<String, List<String>> moduleNamesWithAllParameters = new       
    HashMap<String, List<String>>();
    List<String> parameters = new ArrayList<String>();
    List<String> moduleNames = new ArrayList<String>();
    Iterator it;
    int start = 0, end = 0, mapKeys = 0;

    parameters.add("kExmWoEM2HpMA4CT");
    parameters.add("ILm1nApv06lDtqva");
    parameters.add("gu00xoO5WPTv0SEr");
    parameters.add("kX4FIg6c3C10msex");
    parameters.add("xUcA4Y5rvqxlg8ju");
    parameters.add("TYjydK6AyY7vwYSo");
    parameters.add("#");
    parameters.add("IDvHK1vXMiDEPxad");
    parameters.add("ja0D3LH8ML0mQwZ0");
    parameters.add("#");
    parameters.add("tKgYRVvguvl3ByRc");
    parameters.add("I95sFdAOoUTHjO7Y");

    moduleNames.add("Building 1");
    moduleNames.add("Building 2");
    moduleNames.add("Building 3");

    it = parameters.iterator();
    for (int i = 0; i < moduleNames.size(); i++) {
        do {
            end++;
        } while (it.hasNext() && !(it.next().equals("#")));
        moduleNamesWithAllParameters.put(moduleNames.get(i), parameters.subList(start, end - 1));
        start = end;
    }

    for (String key : moduleNamesWithAllParameters.keySet())
        System.out.println(key + " = " + moduleNamesWithAllParameters.get(key));

    Entry<String, List<String>> entry;
    for (int i = 0; i < moduleNames.size(); i++) {
        entry = moduleNamesWithAllParameters.entrySet().iterator().next();
        mapKeys = entry.getValue().size();
        System.out.println(mapKeys);
    }
}

【问题讨论】:

标签: java hashmap key-value


【解决方案1】:

这一行:

entry = moduleNamesWithAllParameters.entrySet().iterator().next();

不断地在映射的条目集上创建一个新的迭代器并返回第一个条目。所以你只会看到第一个条目。

您可以更改循环以遍历所有条目,如下所示:

for (Entry<String, List<String>> entry : moduleNamesWithAllParameters.entrySet()) {
    mapKeys = entry.getValue().size();
    System.out.println(mapKeys);
}

【讨论】:

    【解决方案2】:

    假设您使用的是 Java8 或更高版本:

    moduleNamesWithAllParameters.entrySet().stream().forEach((entry) -> {
        System.out.println(entry.getValue().size());
    });
    

    【讨论】:

      【解决方案3】:

      将最后一个循环替换为以下内容:

      for (int i = 0; i < moduleNames.size(); i++) {
      
          mapKeys = moduleNamesWithAllParameters.get(moduleNames.get(i)).size();
          System.out.println(mapKeys);
      }
      

      或者更整洁一点:

      for(String key : moduleNamesWithAllParameters.keySet()) {
          System.out.println(moduleNamesWithAllParameters.get(key).size());
      }
      

      甚至更简洁(Java 8+):

      moduleNamesWithAllParameters.stream().forEach(entry ->
          System.out.println(entry.getValue().getSize())
      );
      

      或使用valueSet 循环(因为您实际上并没有使用密钥):

      for(List<String> value : moduleNamesWithAllParameters.valueSet()) {
          System.out.println(value.size());
      }
      

      或者如果你喜欢(Java 8+):

      moduleNamesWithAllParameters.valueSet().stream().map(List::size).forEach(System.out::println);
      

      【讨论】:

        【解决方案4】:

        问题发生在这一行:

        entry = moduleNamesWithAllParameters.entrySet().iterator().next();

        entrySet().iterator() 每次循环都是一个新对象。

        所以你的地图尺寸只是第一个尺寸。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-05
          • 2014-01-02
          • 1970-01-01
          • 2014-08-27
          • 2013-05-27
          • 2014-03-30
          相关资源
          最近更新 更多