List 移除指定元素
一、需求描述
我想在 list 中删除指定的元素,我该如何进行操作呢?
二、代码展示
我们使用 for 循环的形式来解决下上面提出的需求,代码如下:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
for(int i=0;i<list.size();i++) {
if("bb".equals(list.get(i))) {
list.remove(i);
}
}
for(String s:list) {
System.out.println(s);
}
}
}
运行结果如下所示,貌似出了个小问题,因为有个 bb 并没有去除掉。
三、原因分析
为什么会出现这种问题呢?当删除第一个 bb 元素后,下一个元素就会向前移一位 , 而 for 循环的索引是继续往后加 1 的,即没删除之前 list.get(2)='bb',当删除第一个 bb 后,下一个元素前移,导致此时 list.get(1)='bb',list.get(2)='cc',而 for 循环里面的 i 并没有发生变化,还是继续执行 +1 向后遍历的操作,导致 bb 元素逃脱了并没有删除。
四、解决方式
4.1 索引前移
只需要在发生删除元素的时候,将索引里面的 i 向前移位即可,即元素发生前移的同时,也让索引发生前移,即 i--,如下代码所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
for(int i=0;i<list.size();i++) {
if("bb".equals(list.get(i))) {
list.remove(i);
i--;
}
}
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下所示:
4.2 倒叙遍历
使用倒序遍历 list,如下所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
for(int i=list.size()-1;i>=0;i--) {
if("bb".equals(list.get(i))) {
list.remove(i);
}
}
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下:
4.3 使用迭代器
使用迭代器 Iterator 来进行元素操作(官方推荐),代码如下所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
if("bb".equals(it.next())) {
it.remove();
}
}
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下所示:
4.4 lambda 表达式
使用 lambda 表达式的方法更为优雅,这里使用了 List 接口所继承的 Collection 接口在 JDK 1.8 新增的 removeIf 方法,该方法接收一个 Predicate 类型的参数,删除列表中满足 Predicate 条件的元素。
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
list.removeIf(e ->"bb".equals(e));
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下: