【问题标题】:Return prime factors from int as input as an array从 int 中返回素数作为数组的输入
【发布时间】:2020-03-14 12:50:50
【问题描述】:

我需要编写一个算法,该算法采用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;

可能是什么原因?

【问题讨论】:

    标签: java primes factorization


    【解决方案1】:

    您实际上并没有通过增加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 的函数并返回正文中的任何内容(-&gt; 之后的部分)。特别是,由于您将一组 装箱 Integers 放在一起,因此您必须将它们拆箱到 ints 中(更多关于装箱 here)。 intValue() 方法正是这样做的。最后,您通过调用toArray() 返回int[]。实际上,您是说:将intValue() 应用于列表中的每个项目并返回结果数组。

    请注意,我按原样采用了您的主要逻辑,我没有深入探讨您如何计算素因数的正确性。

    【讨论】:

    • 非常感谢。我会尝试理解代码:) 它的工作原理
    • 我添加了关于最后一行的解释,这是我在您的代码之上真正添加的唯一部分。
    • 非常感谢!我想我需要在此之后查看流。真的很详细和很好的解释:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多