ArrayList 和 Formatter 未按预期运行

ArrayList and Formatter not behaving as expected

我有两个数组列表,一个包含整个对象列表,第二个包含要从第一个列表中删除的对象。

当我从第一个列表中删除对象并使用格式化程序将这些对象输出到文件时,没有任何内容写入文件。但是,如果我从第一个 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(删除了对象的那个)确实仍然包含对象,并且这些对象包含正确的值。这几乎就像 Arraylist,一旦对象被删除,就会丢失内存中的指针。

有什么想法吗?不幸的是,我不能提供太多的具体代码,但是请提出任何问题,我会尽力回答。语言是 Java,我在 SDK 中使用 Java compliance 1.5。

要识别错误,您可以在删除操作中添加更多输出(作为控制台输出或使用记录器):

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() 实现 class。 如果您有自己的实现,请确保您遵循了 Object.equals()-Contract.

Formatter.flush()Formatter.close()需要在输出结束时调用