Java: подсчитать общее количество элементов в HashMap - PullRequest
21 голосов
/ 31 марта 2011

У меня есть HashMap<String, ArrayList<Item>>, есть ли способ подсчитать общее количество элементов во всех списках на карте, не просматривая все списки?

Или я должен пройти по карте и по всем спискам?

Ответы [ 8 ]

17 голосов
/ 03 мая 2014

Используйте метод 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
13 голосов
/ 15 сентября 2015

Начиная с Java 8, вы выполняете это с помощью одной строки:

Integer sum = map.values().stream().mapToInt(List::size).sum();
11 голосов
/ 31 марта 2011

Возможно, вы захотите увидеть Google Guava и использовать Multimap вместо этого.Метод Multimap.size () даст желаемый ответ.

7 голосов
/ 31 марта 2011

Вам нужно будет перебрать значения List<Item> в вашем Map и подсчитать сумму. Map не знает, какие ценности вы вкладываете в него, поэтому он не может предоставить вам общую сумму. Код, который вам нужен, довольно прост:

int total = 0;
for (List<Item> list : map.values()) {
    total += list.size();
}
2 голосов
/ 31 марта 2011

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

Кстати: вы можете рассчитывать, чтобы вернуть длинный;)

2 голосов
/ 31 марта 2011

Поскольку Map сам не имеет априорных знаний о значениях, хранящихся в нем, за исключением того, что они Object s (таким образом, нельзя ожидать выполнения каких-либо операций над ними, кроме вызова toString(), equals() и / или hashCode()), нет другого способа, кроме как перебирать его элементы и вычислять сумму вручную.

0 голосов
/ 30 октября 2013

Если кто-нибудь еще ищет ответы

Вот код, отправленный

    Iterator<Map.Entry<Integer, ArrayList<ShortListedFlats>>> iter = rentShortListedFlats
            .entrySet().iterator();

    while (iter.hasNext()) {
        ArrayList<ShortListedFlats> shortLists = iter.next().getValue();

        counter = counter + shortLists.size();

    }
0 голосов
/ 31 марта 2011

Да, вам нужен цикл for:

public static int countItems(HashMap<String, ArrayList<Item>> yourMap){
    int counter = 0;
    for(ArrayList<Item>> list: yourMap.values()){
        counter += list.size();
    }
    return counter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...