java 获取HashMap中所有大小的值< String,List< String,String>>

55ooxyrt  于 12个月前  发布在  Java
关注(0)|答案(5)|浏览(93)

在我的HashMap < String,List< String,String>>中,我保存了keys(建筑物的名称)和values(来自该建筑物中设备的ID)。我只想从HashMap中的每个keys中获取值的大小,但我只能从第一个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);
    }
}

字符串

6vl6ewon

6vl6ewon1#

除了上面提到的所有答案之外,如果你想得到Map上所有值的总和,那么你可以这样做:

moduleNamesWithAllParameters.values().stream().mapToInt(List::size).sum();

字符串

irtuqstp

irtuqstp2#

这一行:

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

字符串
不断地在map的条目集上创建一个新的迭代器,并返回第一个条目。所以你只能看到第一个条目。
你可以改变循环来遍历所有条目,像这样:

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

pdkcd3nj

pdkcd3nj3#

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

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

字符串

qf9go6mv

qf9go6mv4#

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

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

kd3sttzy

kd3sttzy5#

问题发生在这一行:
第一个月
entrySet().iterator()在每次循环时都是一个新对象。
所以你的Map尺寸只是第一个尺寸。

相关问题