2014-12-22 126 views
0

我想從Excel中存儲數據,ArrayLists然後將存儲在主ArrayList中。原因在於Excel表格的每一行都有特定於該行的數據。我一直有一個問題,因爲我相信當我在循環回去之前擦除內部ArrayList時,它也會刪除主ArrayList中的數據。Java:從Excel中存儲數據ArrayList的ArrayList的問題

import java.io.*; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import java.util.ArrayList; 


public class StoreData { 

ArrayList<ArrayList<String>> shapes; 
ArrayList<String> innerMembers; 
ArrayList<String> test; 
int start; 
int end; 

public StoreData(){ 
    this.shapes = new ArrayList<>(); 
    this.innerMembers = new ArrayList<>(); 
    this.test = new ArrayList<>(); 
    start = 0; 
    end = 0; 
} 

public ArrayList<ArrayList<String>> storeValues(String shapeType){ 

    //get the shape 
    switch(shapeType){ 
     case "A": 
      start = 1; 
      end = 273; 
      break; 
     case "B": 
      start = 274; 
      end = 291; 
      break; 
     case "C": 
      start = 292; 
      end = 319; 
      break; 
     case "D": 
      start = 320; 
      end = 340; 
      break; 
     case "E": 
      start = 341; 
      end = 372; 
      break; 
     case "F": 
      start = 373; 
      end = 412; 
      break; 
     case "G": 
      start = 413; 
      end = 539; 
      break; 
     case "H": 
      start = 540; 
      end = 814; 
      break; 
     case "I": 
      start = 1464; 
      end = 1958; 
    } 

try 
{ 
    FileInputStream x = new FileInputStream(new File("/Users/JohnDoe/Documents/File.xls")); 

    //Create Workbook instance 
    Workbook workbook = new HSSFWorkbook(x); 

    //Get first/desired sheet from the workbook 
    Sheet sheet = workbook.getSheetAt(0); 

    //Iterate through each rows one by one 
    for (int i = start; i <= end; i ++){ 

     Row row = sheet.getRow(i++); 

     //iterate through each cell in row: max number of cells is 76 
     for (int j = 0; j < 77; j++) { 

      Cell cell = row.getCell(j); 
      cell.setCellType(1); 
      innerMembers.add(cell.getStringCellValue()); 
    }    

    /*******************/ 
    //Add to master ArrayList and clear inner ArrayList to get repopulated 
    /*******************/ 
    shapes.add(innerMembers); 
    innerMembers.clear(); 
} 
x.close(); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

/***TEST STATEMENT***/ 
System.out.println(shapes.get(8).get(20)); 
/***TEST STATEMENT***/ 

return shapes; 

} 
} 
+2

你需要在每次調用storeValues方法一次創建innermembers的一個新的ArrayList。這些形狀存儲相同的內部元素實例,並且當您清除數組列表中的元素時,它將反映形狀參考數組列表。 –

回答

2

你可能也想嘗試:

shapes.add(new ArrayList<String>(innerMembers)); // shallow copy 
innerMembers.clear(); 
+0

工作完美,謝謝。 –