現在、Java 8のストリームAPIを私の日常のJavaツールボックスに組み込もうとしています。私は、ストリームを使用して正の整数の素因数を見つけようとしています。次に、各因子を並列配列に多重化して配列(またはArrayList
)に格納します。代わりに、私はストリーム... FactorWithMultiplicity
オブジェクト、またはMap
を作成して、因子としての係数と多重度を値として作成しようとしています。要因が昇順でソートされていて、それが非常に大きな数値を扱うことができればいいです(例えば、私は、Long.MAX_VALUE
と言っています)。ストリームと正の整数の因数分解
現在のところ、私のコードはこのように見えますが、私はStreamsの初心者ですから、このタスクを達成するためのより速く、より適切な方法があると確信しています。 Streamsを使用してソリューションを作成してください。ただし、一部の非ストリームソリューションが高速であることがわかっている場合は、そのコードにも私を指差してください。
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;
を私はと感じあなたは奇妙な方法でストリームを使用しています。これは、外部変数を操作するためにラムダを実行するために使用するためですが、通常はストリームの目的はストリーム自体の数値をマップまたはフィルタリングすることです。 – Nayuki
@Nayukiあなたが正しいです。私はラムダがプライムファクタとその多重度を含むストリームにマッピングされている方がずっと良いと思います。 – 4castle
私は本当の解決策は、この問題にストリームをまったく使用しないことだと思います。 –