Java 用映射填充arraylist

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

我从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;
    }
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第二种方法是您需要的