Ответ 1
Возможно, вы захотите увидеть Google Guava и вместо этого используйте Multimap. Метод Multimap.size() предоставит вам ответ.
У меня есть этот HashMap<String, ArrayList<Item>>
, есть ли способ подсчитать общее количество элементов во всех списках на карте, не просматривая все списки?
Или я должен перебирать через карту и по всем спискам?
Возможно, вы захотите увидеть Google Guava и вместо этого используйте Multimap. Метод Multimap.size() предоставит вам ответ.
Используйте метод size(), определенный для HashMap.
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
Вам нужно будет перебирать значения List<Item>
в Map
и подсчитывать общее количество. Map
не имеет каких-либо знаний о том, какие значения вы вкладываете в него, поэтому он не может предоставить вам возможность получить общую сумму. Код, который вам нужен, довольно прост:
int total = 0;
for (List<Item> list : map.values()) {
total += list.size();
}
С Java 8 вы выполняете это с помощью однострочного интерфейса:
Integer sum = map.values().stream().mapToInt(List::size).sum();
Так как Map
сам не имеет априорного знания о хранящихся в нем значениях, за исключением того, что они Object
(поэтому нельзя ожидать каких-либо операций над ними, кроме вызова toString()
, equals()
и/или hashCode()
), нет другого пути, кроме итерации через его элементы и вычисления суммы вручную.
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;
}
BTW: вы можете захотеть, чтобы count вернул длинный;)
Если кто-то еще ищет ответы
Вот представленный код
Iterator<Map.Entry<Integer, ArrayList<ShortListedFlats>>> iter = rentShortListedFlats
.entrySet().iterator();
while (iter.hasNext()) {
ArrayList<ShortListedFlats> shortLists = iter.next().getValue();
counter = counter + shortLists.size();
}
Да, вам нужен цикл for:
public static int countItems(HashMap<String, ArrayList<Item>> yourMap){
int counter = 0;
for(ArrayList<Item>> list: yourMap.values()){
counter += list.size();
}
return counter;
}