自定义一个ArrayList然后把符合条件的元素删除。
第一种方法:顺序循环,减一操作,把符合条件的元素删除;如果不进行减一操作,当list把符合条件的元素删除后,后面符合的元素可能不会删除,导致程序出错。
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
for (int i = 0; i < list.size(); i++) {
if ("Tom".equals(list.get(i))) {
list.remove(i);
// 减一操作
i--;
}
}
System.out.println(list.toString());
}
}
结果如下:
错误代码:
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
for (int i = 0; i < list.size(); i++) {
if ("Tom".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list.toString());
}
}
View Code
结果如下:
为什么会出现这种情况呢?原来List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。
第二种方法:倒序循环,把符合条件的元素直接删除。
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
for (int i = list.size() - 1; i >= 0; i--) {
if ("Tom".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list.toString());
}
}
结果如下:
第三种方法:使用迭代器,把符合条件的元素删除。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Tom");
list.add("Tom");
list.add("David");
list.add("Lily");
list.add("Lucy");
list.add("James");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("Tom".equals(it.next())) {
it.remove();
}
}
System.out.println(list.toString());
}
}
结果如下:
推荐使用第三种方法进行remove操作。