0

在此代码中,如果某个值为零 [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

4 回答 4

4

当您删除某些内容时,所有以下索引都会减少 1。增加循环计数器将跳过下一个元素。他们是你所缺少的。

你需要做这样的事情:

Portfolio.total.get(k).remove(c); // you already have this line
c--;

另外,为了便于阅读,我更喜欢使用 an Iteratorand it'sremove()方法。这样您就不必担心索引。

于 2013-04-24T10:09:21.417 回答
1

您不应该在向前迭代数组时从数组中删除项目。问题可能是因为两个直接数量的项目一个接一个

例如 item[0].current_quantity 为 0 并且 item[1].current_quantity 为 0

因此,如果您遍历列表,item[0] 将被删除,item[1] 将成为 item[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);
    }
}
于 2013-04-24T10:15:34.880 回答
0

这是因为您跳过了许多项目!当你删除一个对象时,列表会变小,所以你不会检查之后的对象,每次删除一个对象后,做一个c--,它会解决问题

于 2013-04-24T10:10:01.643 回答
0

您正在访问一个列表并在 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
      }
 }
于 2013-04-24T10:14:20.157 回答