2016-11-10 3 views
0

Я пытаюсь пройти некоторые данные excel2007 с помощью poi.jar на основе jdk1.6. Но когда мне кажется странным явлением, что когда я пересекаю строку (хранится по HashMap()), а затем добавить данные строки в java.util. ArrayList.Map.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

Смежные вопросы