2016-11-10 4 views
0

jdk1.6に基づいてpoi.jarを使用していくつかのexcel2007データをトラバースしようとしていますが、私が行をトラバースしたときにHashMap())、行データをjava.utilに追加します。 ArrayListMap.clear()次にマップをリストに追加します

次のイテレータを開始すると、まずMap.clear()を呼び出して行データを消去しますが、ArrayList.add()メソッドを再度呼び出すと、この行データは古いデータよりも優先されます。

Map<String, String> cellForRow = = new HashMap<String, String>(); 
    List<Map<String, String>> rowForSheet = new ArrayList<Map<String, String>>(); 
    for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) { 

        row = sheet.getRow(j); 
        if (j == 0) {// the first row is title 
         titleRow = row; 
         continue; 
        } 
        if (row != null && titleRow.getPhysicalNumberOfCells() > 0) { 
         // cellForRow = new HashMap<String, String>(); 
         cellForRow.clear(); 
         for (int k = 0; k < titleRow.getPhysicalNumberOfCells(); k++) {// cell 
          cellForRow.put(getCellValue(titleRow.getCell(k)), getCellValue(row.getCell(k))); 
         } 
        } 
        rowForSheet.add(cellForRow); 
       } 

次のスニペットは、rowForSheet(一覧)のデバッグログを表示し、後でデータが古いデータを上書き

[{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}] 

はあなたをしましたか?

+0

なぜ同じマップを複数回リストに追加しますか? – matt

+1

あなたは何でしたか?あなたの文章を終了してください。 –

答えて

1

最初に、ループ内にマップを作成して、の新しいマップを追加します。

List<Map<String, String>> rowForSheet = new ArrayList<Map<String, String>>(); 
for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) { 

    row = sheet.getRow(j); 
    if (j == 0) {// the first row is title 
     titleRow = row; 
     continue; 
    } 
    Map<String, String> cellForRow = = new HashMap<String, String>(); 
    if (row != null && titleRow.getPhysicalNumberOfCells() > 0) { 
     for (int k = 0; k < titleRow.getPhysicalNumberOfCells(); k++) {// cell 
      cellForRow.put(
       getCellValue(titleRow.getCell(k)), 
       getCellValue(row.getCell(k)) 
      ); 
     } 
    } 
    rowForSheet.add(cellForRow); 
} 

リストの各項目は、追加した新しいデータと異なるマップになります。

+0

私はこの方法で問題を解決することができると知っています。しかし、私はこの方法が無駄だと思っています。行データが十億レベルであれば、 – AndyWang

+0

同じマップを複数回リストに入れたいのはなぜですか?あなたの道は壊れています。なぜこの方法は無駄でしょうか? – matt

+0

私はすべてのループが新しいハッシュマップを作成すると思うので、これらのマップは自由です。だから...(おそらくそれは私の考えです。)あなたはそれを置き換えるためのより良い方法がありますか。 – AndyWang

関連する問題