2015-04-20 117 views
1

我有兩個Arraylists,一個包含一個完整的對象列表,第二個包含要從第一個列表中刪除的對象。ArrayList和Formatter的行爲不如預期

當我從第一個列表中刪除對象,並使用Formatter將這些對象輸出到文件時,沒有任何內容寫入該文件。但是,如果我從第一個Arraylist輸出對象,而不刪除任何對象,則所有這些對象都會出現在文件中。

例如: -

for(Invoice inv : tempStore) 
{ 
    if(invoiceLines.contains(inv))invoiceLines.remove(inv); 
} 

//for each invoice in the ArrayList 
for(Invoice invoice : invoiceLines) 
{ 
    output.format("%"+this.spec.getLength("XXXX")+"s\t",checkString(invoice.getInvoiceDate()));} 

給我任何輸出,但是正是這樣做: -

//for each invoice in the ArrayList 
for(Invoice invoice : invoiceLines) 
{ 
    output.format("%"+this.spec.getLength("XXXX")+"s\t",checkString(invoice.getInvoiceDate()));} 

給我的輸出信息,當手動調試應用程序的數組列表(帶有對象刪除),確實包含仍然是對象,並且這些對象包含正確的值。就好像Arraylist,一旦對象被刪除,就會丟失內存中的指針。

任何想法?不幸的是,我不能在特定的代碼方面付出太多的代價,但是要問任何問題,我會盡我所能地盡力回答。該語言是Java,我在SDK中使用Java合規性1.5。

+1

我會使用一個調試器,並檢查你的'invoiceLines'是否在迭代和打印情況1之前是空的。 – Mena

+0

已經這樣做了,因此使用調試器時對象存在的評論。當我說手動調試時,我的意思是逐步執行代碼並檢查變量,而不是使用我編寫的自動化測試。 –

回答

0

Formatter.flush()Formatter.close()需要在輸出結束時調用。

+0

當不從Arraylist中刪除緩衝區已滿的項目時,一定是純粹的運氣,從而導致所有對象都被寫入文件。 –

0

要確定您可以添加更多的輸出誤差(如控制檯輸出或使用記錄器)上取走操作:

System.out.println("Items before removal: " + invoiceLines.size()); 
for(Invoice inv : tempStore) 
{ 
    if(invoiceLines.contains(inv)) { 
    invoiceLines.remove(inv); 
    System.out.println("removed " + inv + ". Items left: " + invoiceLines.size()); 
    }  

} 

如果有不止一個迭代中移除的項目越多,你要檢查的equals()和hashCode()實現Invoice類。 如果你有自己的實現,確保你遵循Object.equals()-Contract

+0

equals和hashCode的實現是Object.equals()和Object.hashCode()。這些方法在類定義中不會被覆蓋。從ArrayList中移除的項目數量是正確的,並且剩餘的項目也是正確的,每個迭代中不會從Arraylist中移除多個項目。 –