Не удалять объект из 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
      }
 }
Другие вопросы по тегам