2015-04-15 176 views
0

我需要連接BasicDBList中的所有BasicDBObject。每次循環運行時,我的BasicDBObject只包含ONE json元素,並退出我的BasicDBList不包含任何內容。
爲什麼會發生這種情況?將dbLinha.clear()放在避免重複但每次循環運行時評估代碼BasicDBList包含重複!爲什麼我不能連接JSON?

public BasicDBList readMetadados(Planilha planilha) { 
     List<String> cabecalho = new ArrayList<>(); 
     int linhaReferencia = 0; 
     BasicDBObject dbLinha = new BasicDBObject(); 
     BasicDBList listLinha = new BasicDBList(); 

     try { 
      InputStream planilhaFile = new FileInputStream(FileUtils.getFile(UPLOAD_PATH, planilha.getPath())); 
      Sheet linhaInicial = new XSSFWorkbook(planilhaFile).getSheetAt(0); 
      Iterator<Row> rowIterator = linhaInicial.iterator(); 

      while (rowIterator.hasNext()) { 
       Row row = rowIterator.next(); 
       Iterator<Cell> cellIterator = row.cellIterator(); 
       while (cellIterator.hasNext()) { 
        Cell cell = cellIterator.next(); 
        try { 
         if (cell.getCellType() != 3) { 

          if (cell.getCellType() == 1) { 
           if ("Veículo".equals(cell.getStringCellValue())) { 
            linhaReferencia = cell.getRow().getRowNum(); 
            cabecalho.add(cell.getStringCellValue()); 
            while (cellIterator.hasNext()) { 
             cabecalho.add(cellIterator.next().getStringCellValue()); 
            } 
            break; 
           } 
          } 

          if (linhaReferencia != 0) { 
           switch (cell.getCellType()) { 
            case Cell.CELL_TYPE_FORMULA: 
             dbLinha.append(cabecalho.get(cell.getColumnIndex()), cell.getCellFormula()); 
             break; 
            case Cell.CELL_TYPE_BOOLEAN: 
             dbLinha.append(cabecalho.get(cell.getColumnIndex()), cell.getBooleanCellValue()); 
             break; 
            case Cell.CELL_TYPE_NUMERIC: 
             dbLinha.append(cabecalho.get(cell.getColumnIndex()), cell.getNumericCellValue()); 
             break; 
            default: 
             dbLinha.append(cabecalho.get(cell.getColumnIndex()), cell.getStringCellValue()); 
           } 
          } 

         } 
        } catch (IllegalStateException e) { 
         Log.info(this, "Erro ao obter valor da linha [{}] e coluna [{}]", cell.getRow().getRowNum(), cell.getColumnIndex()); 
        } 
       } 
       if (!dbLinha.isEmpty()) { 
        for(int i = 0; i < cabecalho.size(); i++){ 
         if(!dbLinha.containsKey(cabecalho.get(i))){ 
          dbLinha.append(cabecalho.get(i), " "); 
         } 
        } 
        listLinha.add(dbLinha); 
        dbLinha.clear(); 
       } 
      } 
     } catch (FileNotFoundException e) { 
      Log.error(this, "Erro ao processar planilha: Planilha não encontrada.", e); 
     } catch (IOException e) { 
      Log.error(this, "Erro ao processar planilha.", e); 
     } 
     System.out.println(listLinha.toString()); 
     return listLinha; 
    } 

輸出

[ { } , { } , { } , { } , { } , { }] 

BasicDBList的內容你第一次運行時是正確的,第二次開始複製和添加的anteriormentes取代。

BasicDBList的第一次運行循環中的值( 「如果(!dbLinha.isEmpty())」) enter image description here

第二次 enter image description here

+4

如果你可以將這個提取成一個* short *但是* complete *程序來證明這個問題,那真的很有幫助... –

+0

爲了清晰起見編輯了這個問題。主要問題是連接「listLinha」中的所有JSON –

+0

您仍然沒有提供一個簡短但完整的程序來演示問題,儘管... –

回答

2

您正在嘗試使用保存對象clear並且一遍又一遍地使用相同的對象(dbLinha)。這是行不通的。

當您添加一個對象列表,它增加了參考該對象,而不是一個該對象的複製到列表中。因此,基本上,第一次添加的內容是對dbLinha對象的引用,現在您已將列表中的第一項指向與dbLinha設置爲相同的對象。您可以撥打dbLinha.clear()

這意味着存儲在您的列表中的引用是相同的,現在將顯示一個空對象。然後,您將另一行讀入同一對象,將其他引用添加到列表中,然後再清除它。

您的列表中充滿了對您正在重新使用的單個對象的引用。這裏是正在發生的演示:

Demonstration of the process

如果你想留住你的對象,你必須使用new,不clear。您必須創建一個新對象來存儲下一個數據位,因爲添加到列表中不會創建副本,只是引用。所以你基本上必須讓你添加的引用指向舊對象,並從一個新對象開始。

+0

令人驚歎的響應。我真的認爲列表中有一個副本。 –

相關問題