Skip to content
Advertisement

ArrayList.get() function in Java requires int for index instead of the desired long

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;
    }
}

The problem in my code is following: enen if I autobox to <Long>, Java requires to cast to int when I use listOfPrimes::get. It is not desired because the numbers I would work with would be out of scope. How can I fix that?

Advertisement

Answer

In this loop

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;
    }
}

You should change the type of i from long to int. This is not saying that the numbers in listOfPrimes must be int, it only says that the count of elements in listOfPrimes must be representable with a 32bit signed integer.

Indeed, listOfPrimes.size() returns an integer, not a long. In Java, the length of an array is always specified by an int. Hence an array cannot hold more elements than an int can count. As a result, an ArrayList cannot hold more elements either.

Moreover, the Collection.size() method returns an int, so that none of the classes that implement the Collection interface can hold more values.

Edit: As mentioned by user16320675 in the comments, collections can hold more elements than Integer.MAX_VALUE. You just have to be careful about what size() returns in those cases: it returns Integer.MAX_VALUE rather than the actual size.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement