用地图填充数组列表
我正在从一个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<>();
…