Сумма значений из hashmap с использованием потоков - PullRequest
2 голосов
/ 28 апреля 2019

У меня есть хэш-карта огромного размера (около 10 ^ 60).Я помещаю значения в каждую запись по одному.Проблема состоит в том, чтобы получить сумму значений из hashmap для заданного диапазона ключей.Например: если поместить его в простой Hashmap, в качестве ключа используются записи от 0 до 1000, а каждый ключ имеет значение (BigInteger).Теперь проблема состоит в том, чтобы получить сумму значений в диапазоне (скажем) от 37 до 95.

Я пробовал с итератором, но когда мы идем для огромной карты размером 10 ^ 60, настало время принять операцию для большого диапазонаиндексы.

Я пробую это с потоками, но, поскольку я новичок в streams / parallelStreams, я не получаю реального представления об этом.

BigInteger index1 = new BigInteger(array[1]); // array[1] min value
BigInteger index2 = new BigInteger(array[2]); // array[2] max value
BigInteger max = index1.max(index2); // getting max and min range from index1 and index2
BigInteger min = index1.min(index2);
AtomicReference<Long> atomicSum = new AtomicReference<Long>(0l);
hashMap.entrySet().parallelStream().
    forEach(e -> {
        if (e.getKey().compareTo(min) == 1 && e.getKey().compareTo(max) == -1) {
            atomicSum.accumulateAndGet(e.getValue().longValue(), (x,y) -> x+y);
        }
    });

Я искал по SO, и немногие связаныперечислить или без потоков.Просьба также предложить, возможно ли какое-либо улучшение, например, использование какой-либо другой структуры данных вместо HashMap.

1 Ответ

3 голосов
/ 28 апреля 2019

Вы, похоже, ищете что-то вроде:

BigInteger sumOfValues = hashMap.entrySet().stream()
        .filter(e -> e.getKey().compareTo(min) > 0 && e.getKey().compareTo(max) < 0)
        .map((Map.Entry::getValue))
        .reduce(BigInteger.ZERO, BigInteger::add);

или указано в вашем коде

Long sumOfValues = hashMap.entrySet().stream()
        .filter(e -> e.getKey().compareTo(min) > 0 && e.getKey().compareTo(max) < 0)
        .map((Map.Entry::getValue))
        .reduce(BigInteger.ZERO, BigInteger::add).longValue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...