2013-04-24 73 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