Проблемы Java LinkedList - как удалить элементы, которые соответствуют определенным требованиям - PullRequest
1 голос
/ 12 декабря 2011

У меня вопрос,

Вот что мне нужно сделать -

У меня есть BankItem s, которые связаны с числами.Я заполняю список, но когда объект входит на 100 долларов больше, чем наименьшее значение доллара в настоящее время в списке, я хочу удалить объект с низким значением.

Сначала - я создаю список

    List<BankItem> listOfBankItems = new LinkedList<BankItem>();

Позже в программе я создаю новый объект BankItem и добавляем его в список

listOfBankItems.add(createdItem);

, и после добавления каждого элемента я хочу проверить, что новый элемент стоит на 100 долларов больше, чем любойобъект уже в списке, поэтому я запускаю что-то вроде этого

   for (int i = 0; i < listOfBankItems.size(); i++) {
    int oldValue =listOfBankItems.get(i).getAmount();
    int  newValue = createdItem.getAmount();
    int calculatedDif = newValue - oldValue;


    if (calculatedDif > 100) {
       listOfBankItems.remove(i); 
    }
}

К сожалению, это не работает.Я не знаю, в чем дело.Может мне не стоит использовать LinkedList?Может быть, моя логика совершенно неосновна.Пожалуйста, помогите.

Спасибо !!!

Ответы [ 2 ]

6 голосов
/ 12 декабря 2011

Проблема в том, что индекс всех элементов после удаленного будет меняться после удаления этого элемента; поэтому вы в основном пропустите следующий элемент после его удаления.

Используйте итератор:

for (Iterator<BankItem> itr = listOfBankItems.iterator(); itr.hasNext();) {
    BankItem item = itr.next();
    int oldValue = item.getAmount();
    int newValue = createdItem.getAmount();
    int calculatedDif = newValue - oldValue;
    if (calculatedDif > 100) {
       itr.remove(); 
    }
}
2 голосов
/ 12 декабря 2011

Ваша самая важная проблема, вероятно, связана с одновременным изменением Например, если удаляется элемент № 49, как только вы удалите его, следующим элементом будет № 49, но вы будете проверять № 50 (так как i все еще был увеличен) - так что вы вероятно, отсутствуют элементы из вашего чека.

Есть несколько способов справиться с этим. Вы можете удалить i++ из вашего цикла for (оставив только точку с запятой), а затем сделать это:

if (calculatedDif > 100) {
   listOfBankItems.remove(i); 
} else {
   i++;
}

В качестве альтернативы, вы можете использовать Iterator и его метод remove(), который будет обрабатывать это для вас автоматически.

Вы также можете улучшить производительность, не получая newValue и не пересчитывая calculatedDif на каждом шаге цикла. Объявите эти 2 строки над циклом for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...