用地图填充数组列表

我正在从一个Excel电子表格中获取数据,并试图将每一行添加到一张地图,然后将该地图放入一个数组列表中,多次只放入最后一行这是我的代码:

Iterator<Row> rowIterator = sheet.iterator(); Map<String,Object> cells = new HashMap<String,Object>(); ArrayList list = new ArrayList(); table(cells,rowIterator,list); public ArrayList table(Map<String,Object> cells, Iterator<Row> rowIterator,ArrayList list) throws Exception { while(rowIterator.hasNext()) { Row row = rowIterator.next(); //For each row, iterate through each columns Iterator<Cell> cellIterator = row.cellIterator(); while(cellIterator.hasNext()) { Cell cell = cellIterator.next(); if(cell.getRowIndex()>=1){ //cell = cellIterator.next(); Object obj = null; switch(cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: obj = cell.getBooleanCellValue(); System.out.print((boolean)obj + "\t\t\t"); cells.put(columnName(cell.getColumnIndex()),obj); list.add(cells); break; case Cell.CELL_TYPE_BLANK: obj = cell.getStringCellValue(); System.out.print((String)obj + "\t\t\t"); cells.put(columnName(cell.getColumnIndex()),obj); list.add(cells); break; case Cell.CELL_TYPE_NUMERIC: obj = cell.getNumericCellValue(); System.out.print((double)obj+ "\t\t\t"); cells.put(columnName(cell.getColumnIndex()),obj); list.add(cells); break; case Cell.CELL_TYPE_STRING: obj = cell.getStringCellValue(); System.out.print((String)obj + "\t\t\t"); cells.put(columnName(cell.getColumnIndex()),obj); list.add(cells); break; } } } System.out.println(""); } return list; } 

数组列表应该有

[{userid = 1,name = dave},{userid = 2,name = terry}]

在它里面究竟是怎么一回事呢?

{userid = 2,name = terry},{userid = 2,name = terry},{userid = 2,name = terry},{userid = 2,name = terry},{userid = 2,name = terry} ,{userid = 2,name = terry},{userid = 2,name = terry}]

我怎样才能阻止这种情况发生?

你的问题是这条线:

 cells.put(columnName(cell.getColumnIndex()),obj); 

因为cell.getColumnIndex())对于每一行都是相同的,所以用最后一行覆盖所有的值。

list.add(cell); 为每个单元格添加不是一次而不是行

避免使用Map<Integer,Map<String, Object>>是你需要的还是使用新的地图foreach行。

第二种方法:

  while(rowIterator.hasNext()) { Row row = rowIterator.next(); cells = new HashMap<>();