【问题标题】:Not removing object from ArrayList不从 ArrayList 中删除对象
【发布时间】:2013-04-17 20:05:24
【问题描述】:

在这段代码中,如果某个值为零,我需要删除一个对象 [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]仍然在数组列表中。下次运行此代码时,此对象将被正确删除。 总而言之,下次运行此代码时会删除一些值

【问题讨论】:

    标签: java arraylist removeall


    【解决方案1】:

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

    你需要做这样的事情:

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

    另外,为了便于阅读,我更喜欢使用Iterator,它是remove() 方法。这样您就不必担心索引。

    【讨论】:

      【解决方案2】:

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

      例如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);
          }
      }
      

      【讨论】:

      • +1 解释不是100%正确,但是思路和代码都不错;)。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您正在访问一个列表并在 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
              }
         }
        

        【讨论】:

          猜你喜欢
          • 2021-03-11
          • 2015-08-02
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 2020-08-23
          相关资源
          最近更新 更多