-2

私はプログラミングが初めてです。Excelファイルを反復処理して値をハッシュマップHashMapに入れるプログラムがありますが、ハッシュマップ内のオブジェクトには常に最後のレコードがあります。私は自分のコードを投稿します。間違いを教えてくれるかもしれませんし、コードをどのように行うべきかを投稿することもできます。助けてください、本当にここで立ち往生しています。

私のエクセルファイル:

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 ++;
        }
    }
}
4

3 に答える 3

1

コードに関するいくつかの注意点 -

  1. あなたが言う時

    records.put(recordNumber, docMap);
    

    アカウント オブジェクトの参照をマップに配置するだけです。すべての反復で同じ参照を配置するため、Map 内のすべての値は同じ Account オブジェクトを指します。はい、セッターメソッドを使用すると、すべての値が上書きされますが、以前の値は失われます。したがって、すべての反復の最後に、最後のレコードのみを含むすべてのマップ値が得られます。したがって、他の人が上で示唆しているように、行を反復処理するたびに個別の Account オブジェクトを作成する必要があります。

    Account docMap = new Account();
    
  2. あなたのコードから、Excel シートの詳細を Account オブジェクトに保存し、アカウント オブジェクトをレコード番号とともに Map.In ケース 3 と 4 に保存しようとしていることがわかります。なぜセッターではなくゲッター メソッドを使用したのですか。ケース 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 ++;
    
于 2013-05-19T05:15:01.927 に答える