我有一个很大的哈希图(大约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。
答案 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();