我正在读取包含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();
}
}
答案 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);