Вы на самом деле не увеличиваете размер массива, увеличивая d
. После выделения массива его размер становится фиксированным.
Вместо этого вы можете сделать следующее:
public static int[] primes(int number) {
List<Integer> factors = new ArrayList<>();
for(int factor = 2; factor <= number; factor++) {
while (number % factor == 0) {
factors.add(factor);
number = number / factor;
}
}
return factors.stream().mapToInt(n -> n.intValue()).toArray();
}
Метод stream()
представляет ArrayList
как Stream
, что позволяет вам использовать хорошие методы для управления коллекциями. Одним из них является mapToInt
, который позволяет применять функцию к каждому элементу в потоке. Вы применяете функцию, которая принимает n
и возвращает все, что приходит в тело (часть после ->
). В частности, поскольку вы собираете коллекцию в штучной упаковке Integer
с, вы должны распаковать их в int
с (подробнее о боксе здесь ). Метод intValue()
делает именно это. Наконец, вы возвращаете int[]
, вызывая toArray()
. На практике вы говорите: примените intValue()
к каждому элементу в списке и верните полученный массив.
Обратите внимание, что я взял ваш основной лог c как есть, я не go в правильность вычисления основных факторов.