В настоящее время я пытаюсь включить Stream API Java 8 в свой ежедневный инструментарий Java. Я пытаюсь использовать Streams для поиска простых коэффициентов положительного целого числа, а затем хранить каждый из факторов в массиве (или ArrayList
) с их множественностью в параллельном массиве. В качестве альтернативы, я пытаюсь создать Stream of say ... 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
@ Наюки. Ты прав. Я думаю, было бы намного лучше, если лямбда отобразится в поток, содержащий основные факторы и их кратности. – 4castle
Я думаю, что реальное решение - не использовать потоки для этой проблемы вообще. –