我将使用CSV
的OpenCSV
文件读入称为ArrayList<String[]>
的myCSVEntries
。这可以按预期工作,导致文件的每一行都是String[]
中的myCSVEntries
。
现在,我想从myCSVEntries
中提取某些行,并以特定方式将它们分组在一个称为myGroupedEntries
的新变量中。想法是这样的:假设文件具有某些属于组1的行,某些属于组2的行,而某些其他行则不属于组。每个组有2行(即两个String[]
)。
最终,我希望能够按照以下方式访问元素:myGroupedEntries.get(ith group.get(nth line.get(kth item in line))
我已经将myGroupedEntries
声明为ArrayList>。在处理过程中,我使用声明为tempArray
的ArrayList<String[]>
。 tempArray
收集组1的相关行。
完成后,我应用myGroupedEntries.add(tempArray)
。
然后,将tempArray
重置为新的,然后重新开始,但是现在将其填充为第2组元素。完成后,我再次应用myGroupedEntries.add(tempArray)
。
但是,不是myGroupedEntrie
具有类似的结构
myGroupedEntries
- Group1
- group1 line 1
- group1 line 2
- Group2
- group2 line 1
- group2 line 2
相反,它的结构更像
myGroupedEntries
- Group1
- group1 line 1
- Group2
- group1 line 2
- Group3
- group2 line 1
- Group4
- group2 line 2
我猜测添加声明为
tempArray
的ArrayList<String[]>
会导致这种情况,但是我无法找到想要的结构。...甚至不确定是否可行。
任何建议,将不胜感激
该代码看起来像这样
myGroupedEntries = new ArrayList<ArrayList<String[]>>();
ArrayList<String[]> tempArrList = new ArrayList<String[]>();
int iCurrentRow = 0;
for( String[] s: myCSVEntriesList)
{
... various checks/tests
... the file has some lines that begin with "<%Row:xx",
where "xx" is a number indicating the "group" or "set"
that line of the file belongs to.
// see if line is a row, and if it is, which row-group it belongs to
int iRowLoc = s[0].indexOf("<%Row:");
if(iRowLoc > -1)
{
int iRowCLoc = s[0].indexOf(",");
int iRow = Integer.parseInt( s[0].substring(iRowLoc+6, iRowCLoc).toString() );
//
// then see if we are still processing the "same Row's attributes"
//
if( iRow != iCurrentRow)
{
//
// then have a new row-set to process
//
if( tempArrList.size() == 0 )
{
//
// then it's the first "row-set"
//
// ... so get it started with with the first row for this row-set
tempArrList.add(s);
iCurrentRow = iRow;
}
else
{
//
// there is an existing row-set (i.e. the "previous" row-set)
// so must update the master table with the previous row-set
// and create a new temp row-set package
//
myGroupedEntries.add(tempArrList);
tempArrList = new ArrayList<String[]>();
tempArrList.add(s);
iCurrentRow = iRow;
} // if( tempArrList == null)
}
else
{
//
// then it's part of the same row-set
// so just add the current s
//
tempArrList.add(s);
} // if( iRow > iCurrentRow)
} // if(iRowLoc > -1)
//
// do final test to see if there is a last row-set that needs to be added
//
if( tempArrList.size() != 0 )
{
myGroupedEntries.add(tempArrList);
tempArrList = new ArrayList<String[]>();
}
} // for( String[] s: myCSVEntriesList)
最佳答案
您的最终测试
if( tempArrList.size() != 0 )
{
myGroupedEntries.add(tempArrList);
tempArrList = new ArrayList<String[]>();
}
应该在主
for
循环之外。现在,每次将任何内容添加到tempArrList
时都会执行该命令,从而创建您要获得的结果。