Java 以迭代方式从arraylist中删除项

Java 以迭代方式从arraylist中删除项,java,arraylist,Java,Arraylist,我在循环中从arraylist中删除内容。我注意到,当我有两个东西排在一起需要删除时,它会忽略第二个。 例如,我的代码检查arraylist中的数字是否小于静态数字。我有: arraylist[2,5,15,30] 我正在对照它检查 check = 10 所以我有一个循环 for (int i=0;i<arraylist.size();i++){ if(check > arraylist.get(i){ arraylist.remove(i); }

我在循环中从arraylist中删除内容。我注意到,当我有两个东西排在一起需要删除时,它会忽略第二个。 例如,我的代码检查arraylist中的数字是否小于静态数字。我有:

arraylist[2,5,15,30]
我正在对照它检查

check = 10
所以我有一个循环

for (int i=0;i<arraylist.size();i++){
    if(check > arraylist.get(i){
        arraylist.remove(i);
    }
}
删除第一个条目后,将其更改为:

          0,1, 2
arraylist[5,15,30]
我已经检查了0,所以不需要再次检查。 有没有简单的方法来解决这个问题?不改变我的数据结构?
感谢您使用迭代器或向后循环ArrayList。

请查看 它说:

删除此列表中指定位置的元素。将任何后续元素向左移动(从其索引中减去一个)

因此,您可以向后执行,也可以在删除元素时使用迭代器减少循环计数器

for (Iterator<Integer> it = list.iterator(); it.hasNext();) {
   if (check > it.next()) {
        it.remove();
   }
}
for(Iterator it=list.Iterator();it.hasNext();){
如果(选中>it.next()){
it.remove();
}
}

每次从ArrayList中删除项目时,都可以将
i
减去一,如下所示:

for (int i=0;i<arraylist.size();i++){
    if(check > arraylist.get(i){
        arraylist.remove(i);
        i = i--;
    }
}
for(int i=0;i arraylist.get(i){
arraylist.remove(i);
i=i--;
}
}

有三种方法可以做到这一点

  • 使用迭代器-它有一个remove()函数,允许您删除当前项,迭代器将跟踪tihngs

  • 从列表末尾开始,向后迭代

  • 删除项目时,将当前索引向左移动1

  • 如果您删除了很多项目,那么所有这些情况都会非常低效,尽管每次删除一个项目时,您都会对整个列表进行洗牌。最好是:

    // Scan through the array keeping a "read" pointer and a "write" pointer.
    int write = 0;
    for (int scan=0;scan<arrayList.size();scan++) {
        Integer i arrayList.get(scan);
        // Only copy items that match the check
        if (check <= i) {
          if (scan != write) {
              arrayList.set(write, i);
          }
          write++;
        }
    }
    
    // Remove any "dead" entries from the end of the list
    while (arrayList.size() > write) {
       arrayList.remove(arrayList.size()-1);
    }
    
    //扫描数组,保留一个“读”指针和一个“写”指针。
    int write=0;
    对于(int scan=0;scan,您可以使用或。这些接口让您可以在一个步骤中迭代并删除集合

    样本测试:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    import org.junit.Before;
    import org.junit.Test;
    import static org.junit.Assert.*;
    
    public class ListIteratorTest {
    
        List<Integer> list;
    
        @Before
        public void setUp() {
            list = new ArrayList<>();
            list.add(2);
            list.add(5);
            list.add(15);
            list.add(30);
        }
    
    
        @Test
        public void testListIterator() {
            ListIterator<Integer> lit = list.listIterator();
            while(lit.hasNext()){
                int val = lit.next();
                if(val > 10){
                   lit.remove();
                }
            }
    
            assertFalse(list.contains(15));
        }
    }
    
    import java.util.ArrayList;
    导入java.util.List;
    导入java.util.ListIterator;
    导入org.junit.Before;
    导入org.junit.Test;
    导入静态org.junit.Assert.*;
    公共类ListIteratorTest{
    名单;
    @以前
    公共作废设置(){
    列表=新的ArrayList();
    增加(2);
    增加(5);
    增加(15);
    增加(30);
    }
    @试验
    public void testListIterator(){
    ListIterator lit=list.ListIterator();
    while(lit.hasNext()){
    int val=lit.next();
    如果(val>10){
    删除();
    }
    }
    assertFalse(列表包含(15));
    }
    }
    
    您缺少了一个
    ,应该是这样的:
    数组列表。删除(i);
    @hichris123我没有注意到那个打字错误,谢谢。
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    import org.junit.Before;
    import org.junit.Test;
    import static org.junit.Assert.*;
    
    public class ListIteratorTest {
    
        List<Integer> list;
    
        @Before
        public void setUp() {
            list = new ArrayList<>();
            list.add(2);
            list.add(5);
            list.add(15);
            list.add(30);
        }
    
    
        @Test
        public void testListIterator() {
            ListIterator<Integer> lit = list.listIterator();
            while(lit.hasNext()){
                int val = lit.next();
                if(val > 10){
                   lit.remove();
                }
            }
    
            assertFalse(list.contains(15));
        }
    }