【问题标题】:Remove item from ArrayList<ArrayList<T>>>从 ArrayList<ArrayList<T>>> 中删除项目
【发布时间】:2017-11-14 11:19:38
【问题描述】:

在下面的代码中,我想在第一个“for 循环”中从 ArrayList 中删除为 null 或 arraylist 大小为零的项目。运行第一个循环后,我又有了第二个循环。在第二个循环中,我测试了它是否包含任何为空或项目大小为零的项目。虽然我在第一个循环中擦除,但 ArrayList BS 包含已从列表中删除的项目。

ArrayList<ArrayList<Record>> BS = new ArrayList<>(); 
.
.// some codes
.

for (int j = 0; j < BS.size(); j++) {
    if(BS.get(j) == null || BS.get(j).size() == 0){
        BS.remove(j);
    }
}


for (int j = 0; j < BS.size(); j++) {
    if(BS.get(j) == null || BS.get(j).size() == 0){
            System.out.println("Again, fall into if condition");
    }
}

【问题讨论】:

    标签: java list arraylist


    【解决方案1】:

    您遇到的问题是您不会在删除项目后立即检查该项目。

    要么:

    BS.removeIf(a -> a == null || a.isEmpty());
    

    或者反向迭代列表:

    for (int j = BS.size() - 1; j >= 0; j--) { ... }
    

    或使用Iterator,并使用remove() 方法。

    Iterator<? extends List<Record>> it = BS.iterator();
    while (it.hasNext()) {
      List<Record> list = it.next();
      if (list == 0 || list.isEmpty()) it.remove();
    }
    

    removeIf 是最好的方法,因为它经过优化以知道如何有效地删除许多元素:删除除ArrayList 的最后一个元素之外的任何内容都需要在内部移动具有更大索引的所有元素数组,因此通过简单地调用 remove 来删除元素的时间复杂度是二次的。

    但是,它仅在 Java 8+ 中可用。 (您可以在早期版本的 Java 中非常轻松地实现高效删除;这只是多一点工作)。

    【讨论】:

      【解决方案2】:

      当从一个数组中移除元素时,通常你希望从最后一个元素跳转到第一个元素,否则每次移除你的索引都会跳转一个元素。

      这是因为删除一个项目会将剩余的项目向后移动一个位置,即从位置“j + 1”到位置 j。所以下一个循环你跳过一个位置 j 的项目(即上一个循环中位置 j+1 的项目)。

      试试这个:

      for (int j = BS.size() - 1; j >= 0; j--) {
          if(BS.get(j) == null || BS.get(j).size() == 0){
              BS.remove(j);
          }
      }
      

      【讨论】:

        【解决方案3】:

        问题是当一个项目被删除时,如果条件为真,下一个项目将不会被删除。为此,您应该在删除项目时减少索引。

        如下更改。

        ArrayList<ArrayList<Record>> BS = new ArrayList<>(); 
        .
        .// some codes
        .
        
        for (int j = 0; j < BS.size(); j++) {
            if(BS.get(j) == null || BS.get(j).size() == 0){
                BS.remove(j);
                j--;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-05-29
          • 1970-01-01
          • 2023-03-15
          • 2013-08-31
          • 1970-01-01
          • 2015-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多