如何将数据放入HashMap <key,object =“”> </key,>

时间:2013-05-19 01:07:50

标签: java excel object hashmap

我是编程新手。我有一个程序迭代excel文件并将值放入hashmap HashMapbut对象在哈希映射中总是有最后一条记录。我会发布我的代码,也许你可以告诉我我的错误,或者更好地发布代码应该如何完成。请帮忙,真的卡在这里。

我的Excel文件:

doc seq acc status  notes
1111    2   account test    value1
22222   3   account test2   value2

我的对象......

public class Account{

int docNumber;
int docSequence;
String docAccCode;
String docStatus;
String docNotes;

//getters and setters bellow
......
}

我的迭代方法......

public void readFile() throws IOException{


    InputStream ExcelFileToRead = new FileInputStream(inputFile);
    XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead);
    XSSFSheet sheet = wb.getSheetAt(0);
    XSSFRow row = null;
    XSSFCell cell = null;

    int recordNumber = 0;

    Iterator rows = sheet.rowIterator();

    while (rows.hasNext()){
        row=(XSSFRow) rows.next();
        int rowNum = row.getRowNum();
        int cellNum = 0;
        if(rowNum != 0){
            Iterator cells = row.cellIterator();
            while (cells.hasNext()){
                cell=(XSSFCell) cells.next();

                switch(cellNum){
                case 0:
                    docMap.setDocNumber((int)cell.getNumericCellValue());
                    break;
                case 1:
                    docMap.setDocSequence((int)cell.getNumericCellValue());
                    break;
                case 2:
                    docMap.setDocAccCode(cell.getStringCellValue());
                    break;
                case 3:
                    docMap.getDocStatus(cell.getStringCellValue());
                    break;
                case 4: 
                    docMap.getDocNotes(cell.getStringCellValue());
                }   

                cellNum ++;
            }
            // docMap overwrites it's self and has last record only.
            records.put(recordNumber, docMap);

            recordNumber ++;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您似乎正在使用docMap对象的单个实例。您需要在while循环中使用新的docMap。

答案 1 :(得分:1)

关于代码的几点注意事项 -

  1. 当你说

    records.put(recordNumber, docMap);
    

    您只需将帐户对象的引用放在地图中即可。因为在所有迭代中,您放置相同的引用,Map中的所有值都将指向同一个Account对象。是的,当您使用setter方法时,将覆盖所有值,但之前的值将丢失。因此,在所有迭代结束时,您将拥有仅包含最后一条记录的所有地图值。因此,正如其他人在上面建议的那样,每次迭代一行时都需要创建一个单独的Account对象。

    Account docMap = new Account();
    
  2. 从您的代码中我看到您正在尝试将Excel工作表中的详细信息保存到您的帐户对象中,然后将带有记录编号的帐户对象存储到Map中。在案例3和4中,为什么使用了getter方法而不是二传手。将getter方法更改为setter方法,例如case 0,1,2。

      switch(cellNum){
        case 0:
            docMap.setDocNumber((int)cell.getNumericCellValue());
            break;
        case 1:
            docMap.setDocSequence((int)cell.getNumericCellValue());
            break;
        case 2:
            docMap.setDocAccCode(cell.getStringCellValue());
            break;
        case 3:
            docMap.setDocStatus(cell.getStringCellValue());
            break;
        case 4: 
            docMap.setDocNotes(cell.getStringCellValue());
          }
    
  3. 我没有在任何地方看到您的记录地图。因此,您需要使用适当的泛型来定义一个。

    Map<Integer,Account> records = new HashMap<Integer, Account>();
    
  4. 此外,您的recordNumber会为您提供记录顺序。所以你需要在每次迭代中将它递增到行。

    recordNumber ++;
    

答案 2 :(得分:0)

在获取行的位置创建docMap的新实例。

假设docMap是一个帐户对象,应该是这样的:

while (rows.hasNext()){
    row=(XSSFRow) rows.next();
    Account docMap = new Account();
    int rowNum = row.getRowNum();
    ...
    records.put(recordNumber, docMap);
    recordNumber ++;
}

否则,您只是将每个相同的Account对象放入地图,同时将其更新到excel文件的最后一行。