2013-04-24 52 views
0

在此代码中,如果某个值为零,我需要删除一个对象 [Portfolio.total.get(k).get(c).current_quantity == 0]。不从ArrayList中移除对象

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(); 
    } 

的问题是,i之后再次运行这个循环来检查,如果一切正常,但有时似乎1-3值虽然有[Portfolio.total.get(K)获得(c)中.current_quantity = = 0]仍然在arraylist中。下次运行此代码时,该对象将被正确删除。 总结一些值将在下次运行代码时被删除

回答

4

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

你需要做这样的事情:

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

此外,为便于阅读的缘故,我宁愿使用Iterator和它的remove()方法。这样你就不必担心索引。

+0

很好,虽然我觉得有点转储... – igoutas 2013-04-24 10:15:20

0

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

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 
     } 
} 
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); 
    } 
} 
+0

+1的解释是不是100 %正确,但想法和代码是好的;)。 – jlordo 2013-04-24 10:21:24

+1

纠正了我的解释一下 – 2013-04-24 10:22:33