Java 用映射填充arraylist
我从excel电子表格中获取数据,并尝试将每一行添加到地图中,然后将该地图放入数组列表中。然而,它只是多次放入最后一行。这是我的代码:Java 用映射填充arraylist,java,excel,map,arraylist,spreadsheet,Java,Excel,Map,Arraylist,Spreadsheet,我从excel电子表格中获取数据,并尝试将每一行添加到地图中,然后将该地图放入数组列表中。然而,它只是多次放入最后一行。这是我的代码: Iterator<Row> rowIterator = sheet.iterator(); Map<String,Object> cells = new HashMap<String,Object>(); ArrayList list = new Array
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;
}
Iterator行迭代器=sheet.Iterator();
映射单元格=新的HashMap();
ArrayList=新建ArrayList();
表(单元格、行迭代器、列表);
公共ArrayList表(映射单元格、迭代器rowIterator、ArrayList)引发异常
{
while(roweiterator.hasNext()){
行=行迭代器。下一步();
//对于每一行,遍历每一列
迭代器cellIterator=row.cellIterator();
while(cellIterator.hasNext()){
Cell=cellIterator.next();
如果(cell.getRowIndex()>=1){
//cell=cellIterator.next();
objectobj=null;
开关(cell.getCellType()){
case Cell.Cell\u类型\u布尔值:
obj=cell.getBooleanCellValue();
System.out.print((布尔)obj+“\t\t\t”);
cells.put(columnName(cell.getColumnIndex()),obj);
列表。添加(单元格);
打破
case Cell.Cell\u类型\u空白:
obj=cell.getStringCellValue();
System.out.print((字符串)obj+“\t\t\t”);
cells.put(columnName(cell.getColumnIndex()),obj);
列表。添加(单元格);
打破
case Cell.Cell\u类型\u数值:
obj=cell.getNumericCellValue();
系统输出打印((双)obj+“\t\t\t”);
cells.put(columnName(cell.getColumnIndex()),obj);
列表。添加(单元格);
打破
case Cell.Cell\u类型\u字符串:
obj=cell.getStringCellValue();
System.out.print((字符串)obj+“\t\t\t”);
cells.put(columnName(cell.getColumnIndex()),obj);
列表。添加(单元格);
打破
}
}
}
System.out.println(“”);
}
退货清单;
}
数组列表应具有
[{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(单元格)代码>为每个单元格而不是每行添加一次
要避免这种情况,请使用Map
这正是您需要的,或者为每行使用新的Map
第二种方法:
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
cells = new HashMap<>();
while(roweiterator.hasNext()){
行=行迭代器。下一步();
cells=新HashMap();
…您的问题在于这一行:
cells.put(columnName(cell.getColumnIndex()),obj);
您将用最后一行覆盖所有值,因为cell.getColumnIndex())
对于每一行都是相同的
和list.add(cell);
为每个单元格而不是每行添加一次
要避免这种情况,请使用Map
这正是您需要的,或者为每行使用新的Map
第二种方法:
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
cells = new HashMap<>();
while(roweiterator.hasNext()){
行=行迭代器。下一步();
cells=新HashMap();
…那么如何才能为每个值获取一个键?@TomRodd i thing第二种方法是您需要的,那么如何才能为每个值获取一个键?@TomRodd i thing第二种方法是您需要的