Java 以迭代方式从arraylist中删除项
我在循环中从arraylist中删除内容。我注意到,当我有两个东西排在一起需要删除时,它会忽略第二个。 例如,我的代码检查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[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--;
}
}
有三种方法可以做到这一点
// 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));
}
}