我有这个HashMap<String, ArrayList<Item>>
,有没有办法计算地图中所有列表中的项目总数而不通过所有列表?
或者我应该遍历地图和所有列表?
答案 0 :(得分:17)
使用为HashMap定义的size()方法。
HashMap<String, ArrayList<Item>> hMap = new LinkedHashMap<String, ArrayList<Item>>();
int hSize;
/*
put/remove operations
*/
hSize = hMap.size(); // Gives the total no. of elements of HashMap
答案 1 :(得分:13)
从Java 8开始,您可以通过单行代码实现这一目标:
Integer sum = map.values().stream().mapToInt(List::size).sum();
答案 2 :(得分:11)
您可能希望看到Google Guava并使用Multimap代替。 Multimap.size()方法将提供您想要的答案。
答案 3 :(得分:7)
您需要迭代List<Item>
中的Map
值并计算总数。 Map
并不了解您所投入的价值,因此无法为您提供全面的便利。您需要的代码非常简单:
int total = 0;
for (List<Item> list : map.values()) {
total += list.size();
}
答案 4 :(得分:2)
由于Map
本身没有关于存储在其中的值的先验知识,除了它们是Object
s(因此不能期望对它们执行任何操作,除了调用{ {1}},toString()
和/或equals()
)除了迭代其元素并手动计算总和之外别无他法。
答案 5 :(得分:2)
Multimap听起来像是正确的选择,但你可以做到
public static <K, V> int count(Map<K, ? extends Collection<V>> map) {
int count = 0;
for (Collection<V> coll : map.values()) count += coll.size();
return count;
}
顺便说一句:你可能想要数来返回一个长的;)
答案 6 :(得分:-1)
如果还有人仍在寻找答案
这是发布的代码
Iterator<Map.Entry<Integer, ArrayList<ShortListedFlats>>> iter = rentShortListedFlats
.entrySet().iterator();
while (iter.hasNext()) {
ArrayList<ShortListedFlats> shortLists = iter.next().getValue();
counter = counter + shortLists.size();
}
答案 7 :(得分:-2)
是的,你需要一个for循环:
public static int countItems(HashMap<String, ArrayList<Item>> yourMap){
int counter = 0;
for(ArrayList<Item>> list: yourMap.values()){
counter += list.size();
}
return counter;
}