我想在流上连续执行以下操作。
1)。我想创建一个从2
到n
的数字流。
我想这可以这样做:IntStream.range(2, n)
。
2)。添加过滤器,只有当此数字不能被已通过此过滤器的任何其他数字整除时,才能使数字更进一步。
我无法实现此类过滤器。我想我必须创建一个包含ArrayList
的匿名类,我将在此ArrayList
中存储通过此过滤器的所有数字。这一切应该看起来像:
IntStream.range(2, n).filter(new IntPredicate() {
ArrayList<Integer> prev;
@Override
public boolean test(int value) {
if (prev == null) {
prev = new ArrayList();
return true;
}
for (int i = 0; i < prev.size(); i++) {
if (value % prev.get(i) == 0) {
return false;
}
}
prev.add(value);
return true;
}
3)。获取Map<Integer, Integer>
,其中密钥为数百(即100,200,300,400等),值为每百个中的素数数。因此,对于百100
,我必须找到[100,199]范围内的素数数量。
我想非常清楚,在第二步之后,流中只剩下素数。但是我不知道如何执行第三步并且不确定我对第二步的实现。
您能帮我正确应用所有操作吗?
答案 0 :(得分:5)
假设您有方法isPrime(int)
(您可以在线轻松找到实施方案),请按以下步骤对结果进行分组:
IntStream.range(2, n)
.filter(i -> isPrime(i))
.boxed()
.collect(Collectors.groupingBy(i -> i / 100 * 100,
Collectors.summingInt(i -> 1)))
答案 1 :(得分:1)
我稍微更改了你的代码,因为如果你在循环中检查prev null,那么IntStream就会出错。
您可以运行代码来检查结果。
%filePath%\