2015-04-20 3 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 (тот, с объектами удаляется), содержит объекты по-прежнему, и эти объекты содержат правильные значения. Это похоже на то, что Arraylist, когда объекты удаляются, теряет указатели в памяти.

Любые идеи? К сожалению, я не могу много сделать для конкретного кода, однако задаю любые вопросы, и я постараюсь ответить как можно лучше. Язык Java, и я использую Java 1.5 в SDK.

+1

Я бы использовал отладчик и проверял, что ваши 'invoiceLines' не пусты перед итерацией и печатью в случае 1. – Mena

+0

Уже сделано так, следовательно, комментарий при использовании отладчика присутствует. Когда я говорю об отладке вручную, я имею в виду в том, что нужно переходить через код и проверять переменные, а не использовать автоматические тесты, которые я написал. –

ответ

0

Formatter.flush() и Formatter.close() необходимо называть в конце вывода.

+0

Должно быть, было чистой удачей, если не удалили элементы из Arraylist, чтобы буфер был заполнен, тем самым вызывая все объекты, которые будут записаны в файл. –

0

Чтобы определить ошибку вы можете добавить больше выхода (в качестве вывода консоли или с помощью Logger) на операции удаления:

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 за итерацию. –

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