2016-12-08 3 views
-2

Используя список строк, я пытаюсь сопоставить строку в листе excel и добавлять элементы ячейки во внутренний список. Добавление внутреннего списка во внешний список с помощью цикла. Пожалуйста, обратитесь кодом нижеНевозможно добавить списки в список, используя java

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]] Что-то не так точно. Любая помощь будет оценена.

+0

какой шаг точно терпит неудачу? – XtremeBaumer

+0

Это не терпит неудачу. Я, но список 'listTestCases' заменяется последними' listTestSteps'. Вместо добавления вместо замены. – avirup

+0

Значения, которые вы читаете и печатаете, являются правильными значениями? – XtremeBaumer

ответ

2

Используя команду

listTestSteps.clear(); 

в петле позволяет использовать всегда тот же список, так что в каждой итерации просто пустой и пополнить один и тот же список и добавить его к внешнему списку. По этой причине внешний список в конце будет содержать х записей, указывающих всегда в том же списке, который заполняется данными, которые вы помещаете там на последней итерации.

Таким образом, вы просто должны сделать

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

вместо очистки списка

+0

Lovely. Я получаю ожидаемые результаты. Но только для разъяснения - вместо того, чтобы очищать список, я каждый раз начинаю новый Arraylist? – avirup

+1

Да. В противном случае вы всегда будете добавлять, итерацию по итерации, тот же объект, который каждый раз очищается и заполняется новыми данными – Massimo

1

Проблема заключается в добавлении ссылки на listTestSteps к listTestCases, а затем в следующем цикле вы очистить listTestSteps, но очищенный список по-прежнему ссылается на listTestCases. Поэтому предложите использовать ответ Add an object to an ArrayList and modify it later, чтобы гарантировать, что оба списка будут правильно решены.

Смежные вопросы