List的remove()方法详解

Posted anxin_hw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List的remove()方法详解相关的知识,希望对你有一定的参考价值。

一、错误使用场景

1、普通for循环遍历List删除指定元素,list.remove(index)

示例:将姓张的名字移除掉

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张七");
nameList.add("张八");
for (int i = 0; i < nameList.size(); i++) 
     String name = nameList.get(i);
     System.out.println("当前遍历对象==="+name);
     if (name.startsWith("张")) 
         nameList.remove(i);
     

System.out.println(nameList);

 输出结果:

【李四】【张八】遍历被跳过,【张八】没有被成功移除

原因分析:

List调用remove(index)方法后,会移除index位置上的元素,之后的所有元素依次前移,当移除完【张三】时,【李四】变成了数组的第一位,此时的索引应该要index-1才能获取到【李四】。所以每移除一个元素时就需要把index-1,否则原来索引为index+1的元素就无法遍历到。

2、foreach遍历List删除元素

示例:同上

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张七");
nameList.add("张八");
for (String name : nameList) 
    System.out.println("当前遍历对象==="+name);
    if (name.startsWith("张")) 
        nameList.remove(name);
    

System.out.println(nameList);

输出结果:

原因分析:

foreach循环实际上是迭代,使用list.remove(item)方法后,list 对象的modCount值进行了修改,而 list对象的迭代器中的expectedModCount值没有修改,所以抛出了异常

3、直接使用list.remove(object)

示例: 将张三从数组中移除

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张三");
nameList.add("张三");
nameList.remove("张三");
System.out.println(nameList);

输出结果:[李四, 王五, 赵六, 张三, 张三]

原因分析:

list.remove(object)的逻辑和list.remove(index)大致相同:元素依次遍历,数组中存在与入参对象相等的元素就移除,之后的所有元素依次前移,返回true,若不存在与入参相等的元素,返回false。

二、正确使用方法

1、 使用list.removeIf()方法

removeIf()的入参是一个过滤条件,用来判断需要移除的元素是否满足条件。

原理:方法中设置了一个removeSet,把满足条件的元素索引坐标都放入removeSet,然后统一对removeSet中的索引进行移除

示例:将姓张的名字移除掉

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张七");
nameList.add("张八");
nameList.removeIf(o->o.startsWith("张"));
System.out.println(nameList);

输出结果:[李四, 王五, 赵六]

2、使用迭代器Iterator移除元素

迭代器是一个链表,直接使用remove操作不会出现问题

示例:同上

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张七");
nameList.add("张八");
Iterator<String> iterator = nameList.iterator();
while (iterator.hasNext()) 
    if (iterator.next().startsWith("张")) 
        iterator.remove();
    

System.out.println(nameList);

输出结果:[李四, 王五, 赵六]

3、使用list.removeAll()方法

定义一个需要移除的数组,for循环内将需要移除的元素收集在定义的数组中,for循环结束后直接removeAll()

示例:同上

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张七");
nameList.add("张八");
List<String> removeList = new ArrayList<>();
for (String name : nameList) 
    if (name.startsWith("张")) 
        removeList.add(name);
    

nameList.removeAll(removeList);
System.out.println(nameList);

输出结果:[李四, 王五, 赵六]

4、倒序遍历元素然后删除

正序删除元素会移位那我们转变思维倒序遍历

示例:

List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
nameList.add("张七");
nameList.add("张八");
for (int i = nameList.size() - 1; i >= 0; i--) 
    String name = nameList.get(i);
    System.out.println("当前遍历对象===" + name);
    if (name.startsWith("张")) 
        nameList.remove(i);
    

System.out.println(nameList);

输出结果:

 三、总结

1、使用普通for循环删除元素时需要注意索引会变化的问题

2、list删除元素时建议使用迭代器Iterator或者removeIf()方法

列表 List remove()方法

描述

remove() 函数用于删除列表中某个值的第一个匹配项。

语法

list.remove(obj)    一次只能删除一个元素。

del list[]               一次删除多个元素。

参数

  • obj -- 列表中要删除的对象。

返回值

该方法没有返回值但是会移除两种中的某个值的第一个匹配项。

实例  01

remove()的使用方法:

1 #Author:Junce Liu
2 City = ["杭州","苏州","广州","苏州","通州","扬州"]
3 print(City)
4 City.remove("扬州")                 # 删除指定元素“扬州”
5 print(City)
6 
7 输出结果如下:
8 [杭州, 苏州, 广州, 苏州, 通州, ‘扬州‘]
9 [杭州, 苏州, 广州, 苏州, 通州]

实例  02

del list[] 的使用方法:

1 #Author:Junce Liu
2 City = ["杭州","苏州","广州","苏州","通州","扬州"]
3 print(City)
4 del City[4:6]                # 删除索引4:6元素为 "通州","扬州"
5 print(City) 6 7 输出结果如下: 8 [杭州, 苏州, 广州, 苏州, 通州, 扬州] 9 [杭州, 苏州, 广州, 苏州]

 

以上是关于List的remove()方法详解的主要内容,如果未能解决你的问题,请参考以下文章

java中list的remove()问题

java 的list.remove函数?

java list的remove方法问题

java list的remove方法问题

java list的remove方法问题

Java List --remove(int index)与remove(Object o)方法的区别