Возвращать простые множители из int в качестве входных данных в виде массива - PullRequest
0 голосов
/ 14 марта 2020

Мне нужно закодировать алгоритм, который принимает int, получает его простые множители, помещает их в массив и возвращает их.

Мой код следующий.

public static int[] primfaktorzerlegung(int zahl) {
   int d=1; //this is the length of the array

   int[] result = new int[d]; //array has to be returned

   List<Integer> factors = new ArrayList<Integer>();

   for(int factor = 2; factor <= zahl; factor++) {
       while(zahl % factor == 0) {
           factors.add(factor);
           zahl = zahl / factor;
       }
   }

   for(int i : factors){ //trying to get every number of the arraylist
       int z = i;          
       result[d] = z; //trying to put the numbers of the arraylist into the array result
       d++;           //makes the array dimension one higher
   }
   return result; //returns the array

}

Я получаю следующую ошибку:

Error: java.lang.ArrayIndexOutOfBoundsException:
Index 1 out of bounds for length 1
at: result[d] = z;

В чем может быть причина?

1 Ответ

0 голосов
/ 14 марта 2020

Вы на самом деле не увеличиваете размер массива, увеличивая 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 в правильность вычисления основных факторов.

...