ArrayList仅提供嵌套循环外的最后一个元素

时间:2017-10-31 05:27:52

标签: java arrays arraylist

我正在读取包含4列和150个数据的csv文件。首先,我将每行读入字符串数组并将其转换为整数数组。然后我把它改成了arraylist。如果我尝试在循环时显示我的arraylist,它只显示最后的数组条目。完成while循环后,我想要arraylist中的所有值并将其传递给另一个函数。我怎样才能达到这个目标?

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.*;


public class ReadInputCSV {
    public static void main(String[] args) throws Exception {
        List<Integer> intList = new ArrayList<Integer>();

        BufferedReader CSVFile = new BufferedReader(new FileReader("C:/Users/sana/Desktop/DATASET/shuttle.csv"));

        String dataRow = CSVFile.readLine(); 
        while (dataRow != null){
        String[] dataArray = dataRow.split(","); 
        int[] intsArray=new int[dataArray.length]; 
        for(int i=0;i<dataArray.length;i++)
        {
                    intsArray[i]=Integer.parseInt(dataArray[i]);                
        }

       intList = new ArrayList<Integer>(intsArray.length);

       for (int i=0; i<intsArray.length; i++)
       {
                    intList.add(intsArray[i]);
       }

      dataRow = CSVFile.readLine();               

       }
        CSVFile.close();
    } 

}

2 个答案:

答案 0 :(得分:0)

在你的while循环的每次迭代中你都有:

intList = new ArrayList<Integer>(intsArray.length);

在此指令之后,您将在intList中添加数据。因此,您只能看到来自上一次迭代的数据,这是正常的,因为ArrayList的新实例在每次迭代时都与您的intList变量相关联。

你也可以结合使用:

String dataRow = CSVFile.readLine(); 
   while (dataRow != null){

    //...

dataRow = CSVFile.readLine();

进入更紧凑的以下形式:

String dataRow = null;
while ((dataRow = CSVFile.readLine()) != null) {
   // Your loop instructions here
}

应用这些更改后,您的代码将变为:

import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.*;


public class ReadInputCSV {
    public static void main(String[] args) throws Exception {
        List<Integer> intList = new ArrayList<Integer>();

        BufferedReader CSVFile = new BufferedReader(new FileReader("C:/Users/sana/Desktop/DATASET/shuttle.csv"));

        String dataRow = null; 
        while ((dataRow = CSVFile.readLine()) != null){
           String[] dataArray = dataRow.split(","); 
           int[] intsArray=new int[dataArray.length]; 
           for(int i=0;i<dataArray.length;i++)
           {
              intsArray[i]=Integer.parseInt(dataArray[i]);                
           }

           // No more instanciation of the intList here

           for (int i=0; i<intsArray.length; i++)
           {
                    intList.add(intsArray[i]);
           }

           // No more CSVFile.readLine() here               
        }
        CSVFile.close();
    } 
}

这应该为您提供ArrayList中的所有数据,但无法知道哪些数据来自哪一行。如果这对您来说不是问题,这应该适合您。

答案 1 :(得分:-1)

不要在while循环中重新初始化intList。 线下不是必需的

intList = new ArrayList<Integer>(intsArray.length);