Не удалять объект из ArrayList
В этом коде мне нужно удалить объект, если определенное значение равно нулю [Portfolio.total.get(k).get(c).current_quantity==0].
for(int k=0;k<Run_process.total_Agents;k++){
for(int c=0;c<Portfolio.total.get(k).size();c++){
if(Portfolio.total.get(k).get(c).current_quantity==0){
System.out.println("delete Agent"+k+" "+Portfolio.total.get(k).get(c).stocks.stock_Id);
Portfolio.total.get(k).remove(c);
//remove from portfolio if there is no quantity
}
}
//Portfolio.total.get(k).trimToSize();
}
//Portfolio.total.trimToSize();
for(int k=0;k<Run_process.total_Agents;k++){
for(int c=0;c<Portfolio.total.get(k).size();c++){
if(Portfolio.total.get(k).get(c).current_quantity==0){
System.out.println("still zero quantity Agent"+k+" "+Portfolio.total.get(k).get(c).stocks.stock_Id);
//remove from portfolio if there is no quantity
}
}
//Portfolio.total.get(k).trimToSize();
}
Проблема заключается в том, что после того, как я снова запускаю этот цикл, чтобы проверить, все ли в порядке, НО иногда кажется, что 1-3 значения, хотя имеют [Portfolio.total.get (k).get (c).current_quantity == 0], все еще находятся в arraylist. При следующем запуске этого кода этот объект будет удален должным образом. Подводя итог, некоторые значения будут удалены при следующем запуске этого кода
4 ответа
Когда вы что-то удаляете, все последующие индексы уменьшаются на 1. При увеличении счетчика цикла пропускается следующий элемент. Это те, кого вам не хватает.
Вам нужно сделать что-то вроде этого:
Portfolio.total.get(k).remove(c); // you already have this line
c--;
Кроме того, для удобства чтения я бы предпочел использовать Iterator
И его remove()
метод. Таким образом, вам не нужно беспокоиться об индексах.
Вы не должны удалять элементы из массива, перебирая его вперед. Проблема, вероятно, из-за двух предметов с количеством непосредственно один за другим
например, item[0].current_quantity равен 0, а item[1].current_quantity равен 0
Поэтому, если вы перебираете свой список, элемент [0] будет удален, элемент [1] станет элементом [0]. Теперь вы увеличиваете свой индекс и пропускаете свой прежний элемент [1]. Вот почему это все еще в вашем списке.
Если вы действительно хотите перебирать свой список и удалять элементы во время итерации, вы должны сделать это в обратном направлении:
for(int c = Portfolio.total.get(k).size() - 1; c > 0;c--) {
if(Portfolio.total.get(k).get(c).current_quantity==0) {
Portfolio.total.get(k).remove(c);
}
}
Это потому что вы пропускаете много предметов! когда вы удаляете объект, список становится меньше, поэтому вы не проверяете объект, который идет после этого, каждый раз после удаления объекта выполняйте c--
, это решит проблему
Вы получаете доступ к списку и внутри цикла for, удаляя элемент из того же списка. Это может быть проблематичным во многих отношениях. Вы должны лучше использовать Iterator
за это:
for(Iterator<YourObj> it=Portfolio.total.get(k).iterator(); it.hasNext();) {
YourObj obj = it.next();
if(obj.current_quantity==0){
System.out.println("delete Agent"+k+" "+obj.stocks.stock_Id);
it.remove();
//remove from portfolio if there is no quantity
}
}