Java 中的 ArrayList.get() 函数需要 int 作为索引,而不是所需的 long

Sim*_*mon -1 java

import java.util.ArrayList;

public class LargestPrimeFactor {
    private static long maxNum;

    public LargestPrimeFactor(long maxNum) {
        LargestPrimeFactor.maxNum = maxNum;
        ArrayList<Long> listOfPrimes = new ArrayList<>();
        listOfPrimes.add(2L);

        for (long i = 3; i < maxNum / 2; i++) {
            if (i % 2 == 1 && isPrime(i)) {
                listOfPrimes.add(i);
            }
        }

//        for (long i = 0; i < listOfPrimes.size(); i++) {
//            System.out.println(listOfPrimes.get((int) i));
//        }

        for (long i = listOfPrimes.size() -1; i >= 0; i--) {
            if (maxNum % ((long) listOfPrimes.get(i)) == 0) {
                System.out.println("Max Prime Factor is: " + listOfPrimes.get(i));
                break;
            }

//            System.out.println(listOfPrimes.get((int) i));
        }
    }

    private boolean isPrime(long num) {
        for (long i = 2; i < num; i++ ) {
            if (num % i == 0) {
                return false;
            }
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码中的问题如下: enen 如果我自动装箱到,Java 需要在我使用时<Long>强制转换为。这是不需要的,因为我将使用的数字超出了范围。我该如何解决这个问题?intlistOfPrimes::get

Dan*_*las 5

在这个循环中

for (long i = listOfPrimes.size() - 1; i >= 0; i--) {
    if (maxNum % ((long) listOfPrimes.get(i)) == 0) {
        System.out.println("Max Prime Factor is: " + listOfPrimes.get(i));
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

i您应该将from的类型更改longint。这并不是说 中 的数字listOfPrimes必须是int,它只是说 中 的元素计数listOfPrimes必须可以用 32 位有符号整数表示。

事实上,listOfPrimes.size()返回一个整数,而不是一个长整型。在 Java 中,数组的长度始终由 指定int。因此,数组不能容纳比int可计数的元素更多的元素。因此, anArrayList也无法容纳更多元素。

此外,该Collection.size()方法返回一个int,因此实现该接口的类都Collection无法保存更多值。

编辑:正如 user16320675 在评论中提到的,集合可以容纳比Integer.MAX_VALUE. 您只需要注意size()在这些情况下返回的内容:它返回Integer.MAX_VALUE而不是实际大小。