【发布时间】:2016-03-13 05:00:53
【问题描述】:
我目前正在尝试将 Java 8 的 Stream API 合并到我的日常 Java 工具箱中。我正在尝试使用 Streams 来查找正整数的质因子,然后将每个因子存储在一个数组(或ArrayList)中,并将它们的多重性存储在一个并行数组中。或者,我正在尝试创建一个说... FactorWithMultiplicity 对象的流,甚至是 Map ,其中因子作为键,多重性作为值。如果因子按升序排序,并且它甚至可以处理非常大的数字(例如,我敢说,Long.MAX_VALUE),那就太好了。
目前,我的代码看起来像这样,但是,由于我是 Streams 的初学者,我确信有一种更快或更适合的方式来完成这项任务。请使用 Streams 创建您的解决方案,但如果您知道某些非 Stream 解决方案更快,请随时向我指出该代码。
int num = getPositiveInt();
ArrayList<Integer> factors = new ArrayList<>();
ArrayList<Integer> multiplicities = new ArrayList<>();
boolean isPrime = IntStream.rangeClosed(2, num / 2)
.reduce(num, (int temp, int factor) -> {
int count = 0;
while (temp % factor == 0) {
temp /= factor;
count++;
}
if (count > 0) {
factors.add(factor);
multiplicities.add(count);
}
return temp;
}) > 1;
【问题讨论】:
-
我觉得你使用流的方式很奇怪。这是因为您使用它来执行 lambda 以操作外部变量,而通常流的目的是映射或过滤流本身中的数字。
-
@Nayuki 你是对的。我认为如果 lambda 映射到包含主要因素及其多重性的 Stream 会更好。
-
我认为真正的解决方案是根本不使用流来解决这个问题。
-
@StephenC 请解释一下。我认为我的解决方案做得很好,不是吗?至少我在这里只是将 Streams 用作 foreach 循环,但 reduce 的作用远不止于此。
-
素因子的 OO 表示可能是组合因子和多重性的小对象。
标签: java java-8 java-stream prime-factoring