Home > database >  Why do I need to convert from Integer[] to int[]?
Why do I need to convert from Integer[] to int[]?

Time:06-19

I have the following code

public static int[] readCSV() {
    ArrayList<Integer> entries = new ArrayList<>();
    try {
        File file = new File("someDataFile.csv");
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line = "";
        String[] row;
        while((line = br.readLine()) != null) {
            row = line.split(",");
            for(String value : row) {
                int entry = Integer.parseInt(value);
                entries.add(entry);
            }
        }
        br.close();
    } catch(IOException ioe) {
        ioe.printStackTrace();
    }
    int[] IDs = entries.toArray();
    return IDs;
}

Every entry of the csv is an integer stored as a string. I get the following error: "Type mismatch: cannot convert from Object[] to int[]". As far as I understand, "entries" is not an Object[] here, it's an ArrayList<Integer>.

I was using an example given on geeksforgeeks. That didn't work and I'm not sure why.

I also checked the previous answers to the same question, and the top answer works for me. That said, I still don't have an int[], I only have Integer[]. Then I have to do this to convert from Integer[] to int[]. My question is why do I have to do all that instead of int[] IDs = entries.toArray();?

If I do

int[] IDs = new int[entries.size()];
for (int i=0; i<entries.size(); i  ) {
    IDs[i] = entries.get(i);
}

it works fine. Why is that different from int[] IDs = entries.toArray()?

Is there a better way to get the contents of the csv file in an int[]?

CodePudding user response:

First, to answer your question, because a collection (like ArrayList) can only contain object instances. That means you must use the Integer wrapper type instead of the int primitive type. However, in Java 8 , there are simple ways to perform that conversion. I would also strongly recommend a try-with-Resources over manually closing the BufferedReader. I also simplified the code a little. Like,

public static int[] readCSV() {
    List<Integer> entries = new ArrayList<>();
    File file = new File("someDataFile.csv");
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] row = line.split("\\s*,\\s*"); // Consume white space
            for (String value : row) {
                entries.add(Integer.parseInt(value));
            }
        }
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    return entries.stream().mapToInt(Integer::intValue).toArray();
}

CodePudding user response:

List#toArray always returns an Object[]. The closest you can get is entries.toArray(new Integer[0]) to get an Integer[].

To get an int[] you can use the Streams API or loop over the List and copy it over to an array.

Integer[] arr = list.toArray(new Integer[0]);
int[] arr2 = list.stream().mapToInt(i -> i).toArray();
  • Related