无法使用java在列表中追加列表

时间:2016-12-08 10:42:27

标签: java arraylist

使用字符串列表,我试图匹配Excel工作表中的字符串,并在内部列表中添加单元格元素。使用循环在外部列表中添加内部列表。请参考以下代码

public static List<ArrayList<String>> getKeywords(List<String> testCaseIdList, String fileName, String sheetName){

        try {

            ArrayList<String> listTestSteps = new ArrayList<String>();
            List<ArrayList<String>> listTestCases = new ArrayList<ArrayList<String>>(0);
            Sheet sheetKW = ReadExcelFile.readExcel(ST_KEYWORDS);
            String columnValue = null;
            int matchFlag, addListFlag = 0;

            for(String testCaseId : testCaseIdList) {
                Iterator<Row> rowIterator = sheetKW.rowIterator();
                listTestSteps.clear();
                while(rowIterator.hasNext()) {
                    Row rowNext = (Row) rowIterator.next();
                    Iterator<Cell> cellIterator = rowNext.cellIterator();
                    matchFlag = 0;
                    addListFlag = 0;
                    //listTestSteps.clear();
                    while(cellIterator.hasNext()) {
                        Cell nextCell = cellIterator.next();
                        columnValue = nextCell.getStringCellValue();
                        //System.out.println("Column value " +columnValue);
                        if((columnValue.equalsIgnoreCase(testCaseId)) && (columnValue != "" )) {
                            matchFlag = 1;
                        }
                        if(matchFlag == 1 && columnValue != "") {
                            listTestSteps.add(columnValue);
                            addListFlag = 1;  

                            System.out.println("Add Value : "+columnValue);
                        }
                    }
                    if((listTestSteps.isEmpty() == false) && (addListFlag == 1)) {
                        System.out.println("Adding to the Main list");
                        listTestCases.add(listTestSteps);
                        //listTestCases.forEach(System.out::println);
                    }
                }
            }
            //listTestSteps.forEach(System.out::println);

            // Return ArrayList of ArrayLists
            return listTestCases;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

我的输出为

[TC_0003, login, createUser, deleteUser]
[TC_0003, login, createUser, deleteUser]

首先,添加的列表listTestSteps将被最后一个迭代列表替换。

预期产量是 [[TC_0002, login, createUser, deleteUser, newUser], [TC_0003, login, createUser, deleteUser]] 肯定有问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用

   listTestSteps.clear();
循环中的

指令允许您始终使用相同的列表,因此在每次迭代中,您只需清空并重新填充相同的列表并将其添加到外部列表中。因此,外部列表最后将包含始终位于同一列表中的x个条目,这些条目将填充您在上次迭代中放置的数据。

所以你必须要做

   ArrayList<String> listTestSteps = new ArrayList<String>();

而不是清除列表

答案 1 :(得分:1)

问题是您将listTestSteps的引用添加到listTestCases,然后在下一个循环中清除listTestSteps,但清除的列表仍在listTestCases中引用。因此建议使用Add an object to an ArrayList and modify it later的答案来确保两个列表都得到正确解析。