2016-12-08 22 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(); 

指令可以讓你總是使用相同的列表,所以在每次迭代你只是空和填充相同的列表,並將其添加到列表外。出於這個原因,外部列表將在最後包含x個條目,這些條目總是指向相同的列表,這些列表中填充了您在上次迭代中放置的數據。

所以,你只需要做

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

不是清除列表

+0

可愛的。我得到了預期的結果。但僅僅爲了澄清 - 我不是每次清理清單而是發起一個新的Arraylist? – avirup

+1

是的。否則,你會一直添加,迭代迭代,相同的對象,每次都被清除並重新填充新的數據 – Massimo

1

問題是你的listTestSteps的引用添加到listTestCases,然後在您清除listTestSteps下一個循環的,但清除列表仍在listTestCases中引用。所以建議使用Add an object to an ArrayList and modify it later的答案來確保兩個列表都能正確解決。