使用流从哈希图中得出的值之和

时间:2019-04-28 08:28:37

标签: java data-structures java-8 hashmap java-stream

我有一个很大的哈希图(大约10 ^ 60)。 我正在每个条目中逐一输入值。 问题是从给定键范围的哈希映射中获取值的总和。 例如: 简单地说 Hashmap具有从0到1000的项作为键,并且每个键都有一个值(BigInteger)。 现在的问题是要获取值的总和,例如37到95。

我曾经尝试过使用迭代器,但是当我们使用尺寸为10 ^ 60的巨大地图时,需要花费大量时间来操作索引。

我正在尝试使用流,但是作为流/ parallelStream的新手,我对此并不了解。

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上进行搜索,很少有与列表相关或没有Streams的内容。还请提出是否可以进行任何改进,例如使用其他数据结构代替HashMap。

1 个答案:

答案 0 :(得分:3)

您似乎正在寻找类似的东西:

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();