3

我正在尝试创建一个方法来创建给定数字的素因子列表,然后在数组中返回它们。除了将 ArrayList 转换为 Array 之外,一切似乎都运行良好。另外,我不确定我是否正确返回了数组。

这是我的代码...

static int[] listOfPrimes(int num) {
    ArrayList primeList = new ArrayList();
    int count = 2;
    int factNum = 0;

    // Lists all primes factors.
    while(count*count<num) {
        if(num%count==0) {
            num /= count;
            primeList.add(count);
            factNum++;
        } else {
            if(count==2) count++;
            else count += 2;
    }
}
int[] primeArray = new int[primeList.size()];
primeList.toArray(primeArray);
return primeArray;

它在我编译时返回此错误消息...

D:\JAVA>javac DivisorNumber.java
DivisorNumber.java:29: error: no suitable method found for toArray(int[])
            primeList.toArray(primeArray);
                     ^
method ArrayList.toArray(Object[]) is not applicable
  (actual argument int[] cannot be converted to Object[] by method invocatio
n conversion)
method ArrayList.toArray() is not applicable
  (actual and formal argument lists differ in length)
Note: DivisorNumber.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

此外,我不确定如何接收返回的数组,所以我也需要一些帮助。谢谢!

4

3 回答 3

7

如果要使用泛型toArray()方法,则需要使用Integer包装类而不是原始类型int

Integer[] primeArray = new Integer[primeList.size()];
primeList.toArray(primeArray);

编译器给出的错误是说明您要调用的方法 ( List#toArray(T[])) 不适用于 type 的参数int[],只是因为 anint不是 an Object(它是原始类型)。然而, anInteger 一个Object包装 an (这是该类存在int的主要原因之一)。Integer

当然,您也可以List手动迭代并将其中的Integer元素作为ints 添加到数组中。

SO上有一个相关的问题:How to convert List to int[] in Java? 还有很多其他建议(Apache commons,guava,...)

于 2013-10-18T08:28:57.890 回答
-1
int[] primeArray = primeList.toArray(new int[primeList.size()]);

但我不太有信心能够做到这一点而int不是Integer

于 2013-10-18T08:28:56.733 回答
-2

将 int[] 数组更改为 Integer[]

static Integer[] listOfPrimes(int num) {
    List<Integer> primeList = new ArrayList<Integer>();
    int count = 2;
    int factNum = 0;

    // Lists all primes factors.
    while (count * count < num) {
        if (num % count == 0) {
            num /= count;
            primeList.add(count);
            factNum++;
        } else {
            if (count == 2)
                count++;
            else
                count += 2;
        }
    }

    return primeList.toArray(new Integer[0]);
}
于 2013-10-18T08:32:58.883 回答