我将使用CSVOpenCSV文件读入称为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>。在处理过程中,我使用声明为tempArrayArrayList<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


我猜测添加声明为tempArrayArrayList<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时都会执行该命令,从而创建您要获得的结果。

07-24 09:28