所以我有一些问题与添加数组列表到我的数组列表。把它想象成一个表。
下面是一些示例代码:
ArrayList<String> currentRow = new ArrayList<String>();
while ((myLine = myBuffered.readLine()) != null) {
if(rowCount == 0) {// get Column names since it's the first row
String[] mySplits;
mySplits = myLine.split(","); //split the first row
for(int i = 0;i<mySplits.length;++i){ //add each element of the splits array to the myColumns ArrayList
myTable.myColumns.add(mySplits[i]);
myTable.numColumns++;
}
}
else{ //rowCount is not zero, so this is data, not column names.
String[] mySplits = myLine.split(","); //split the line
for(int i = 0; i<mySplits.length;++i){
currentRow.add(mySplits[i]); //add each element to the row Arraylist
}
myTable.myRows.add(currentRow);//add the row arrayList to the myRows ArrayList
currentRow.clear(); //clear the row since it's already added
//the problem lies here *****************
}
rowCount++;//increment rowCount
}
}
问题是,当我不调用currentRow.clear()
来清除我在每次迭代中使用的ArrayList的内容(放入我的ArrayList of ArrayList)时,每次迭代,我得到那一行加上每一行。
但是当我把currentRow
添加到我的arrayList<ArrayList<String>
后调用currentRow.clear()
时,它实际上清除了我添加到主数组列表以及currentRow对象....的数据我只想让currentRow数组列表为空,而不是我刚刚添加到我的数组列表(Mytable.MyRows[currentRow])的数组列表。
问题在这里:
myTable.myRows.add(currentRow);
您将ArrayList currentRow
添加到这里的"master"列表中。注意,在Java语义下,您正在向currentRow
变量添加一个引用。
在下一行,立即清除currentRow
:
currentRow.clear()
因此,当您稍后尝试使用它时,"主"列表会查找之前的引用,并发现虽然存在ArrayList
对象,但其中不包含String
。
你真正想做的是用新的 ArrayList
重新开始,所以用下面的代码替换上一行:
currentRow = new ArrayList<String>();
那么旧对象仍然被"主"列表引用(因此它不会被垃圾收集),并且当以后访问它时,它的内容将不会被清除。
不要清除当前行,而是在外部循环中为每一行创建一个全新的ArrayList。
当你向列表添加currentRow时,你是在向列表添加一个引用,而不是一个将继续独立存在的副本。