Java: подсчет общего количества элементов в HashMap <String, ArrayList <String>>

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

Или я должен перебирать через карту и по всем спискам?

Ответы

Ответ 1

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

Ответ 2

Используйте метод 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

Ответ 3

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

int total = 0;
for (List<Item> list : map.values()) {
    total += list.size();
}

Ответ 4

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

Integer sum = map.values().stream().mapToInt(List::size).sum();

Ответ 5

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

Ответ 6

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 вернул длинный;)

Ответ 7

Если кто-то еще ищет ответы

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

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

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

        counter = counter + shortLists.size();

    }

Ответ 8

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

public static int countItems(HashMap<String, ArrayList<Item>> yourMap){
    int counter = 0;
    for(ArrayList<Item>> list: yourMap.values()){
        counter += list.size();
    }
    return counter;
}