for循环删除的错误
import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> testString = new ArrayList<>();
testString.add("testa");
testString.add("testb");
testString.add("test");
testString.add("testc");
testString.add("testd");
for(String s : testString){
if(s.equals("test")){
testString.remove(s);
}
}
}
}
由于删除过程中,列表结构发生改变,所以后面的遍历会报错,报错信息如下:
image.png
Iterator删除
import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> testString = new ArrayList<>();
testString.add("testa");
testString.add("testb");
testString.add("test");
testString.add("testc");
testString.add("testd");
Iterator<String> iterator = testString.iterator();
while (iterator.hasNext()){
String s = iterator.next();
if("test".equals(s)){
iterator.remove();
}
}
}
}
此时iterator数据能够正确删除,但是由于Iterator的游标已经偏移到iterator的尾部,Iterator对象没有方法重置游标的方法,所以后续无法遍历
ListIterator删除后遍历
import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> testString = new ArrayList<>();
testString.add("testa");
testString.add("testb");
testString.add("test");
testString.add("testc");
testString.add("testd");
ListIterator<String> listIterator = testString.listIterator();
while (listIterator.hasNext()){
String s = listIterator.next();
if("test".equals(s)){
listIterator.remove();
}
}
// 游标重置为末尾, 倒序遍历即可
while(listIterator.hasPrevious()){
String s = listIterator.previous();
// 此时数据是倒序的, do something
System.out.println(s);
}
}
}
使用ListIterator.previous即可循环倒序遍历,如果处理逻辑对于顺序无要求,可以直接在while循环里面操作,否则可以新建一个list,倒序赋值即可得到正序列表,然后再进行逻辑处理
ListIterator继承Iterator对象,同时增加了hasPrevious, previous等方法,解决了实际开发中遍历删除后,继续遍历的问题
网友评论