List删除指定元素

在List类中,提供了删除元素的remove()方法,有如下两种传参方式

1.根据index删除,会删除指定位置的元素,源码如下

public E remove(int index) {try {ListIterator<E> e = listIterator(index);E outCast = e.next();e.remove();return outCast;} catch (NoSuchElementException exc) {throw new IndexOutOfBoundsException("Index: "+index);}
}

2.根据对象删除 ,源码如下,该方法使用equals方法判断是否为要删除的对象,经测试,使用list.remove(object)方法后,仅删除集合中第一个满足条件的元素

public boolean remove(Object o) {Iterator<E> it = iterator();if (o==null) {while (it.hasNext()) {if (it.next()==null) {it.remove();return true;}}} else {while (it.hasNext()) {if (o.equals(it.next())) {it.remove();return true;}}}return false;
}

根据上述提到的两种方法,可以对List中元素进行删除,但是当需要删除的元素不止一个时,需要循环删除元素,就会产生一些问题

1.采用for循环由小到大删除时,采用remove(int index)方法,会出现指针越界异常。因为移除List中的一个元素后,List长度会减少,但for循环的次数仍是原本List的长度

for(int i = 0,j = numberList.size();i < j;i++){if(numberList.get(i).equals(element)){numberList.remove(element);}}//异常如下
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 11, Size: 10at java.util.LinkedList.checkElementIndex(LinkedList.java:555)at java.util.LinkedList.get(LinkedList.java:476)at com.Test.ListTest.main(ListTest.java:29)

2.当使用Iterator迭代器或是增强for循环遍历数组时,采用remove(Objec o)移除元素时,仍然会出现异常。因为执行 该方法后,对 list 对象的 modCount 值进行了修改,而 list 对象的迭代器的 expectedModCount 值未进行修改

for(Long l : numberList){if(l.equals(element)){numberList.remove(element);}}Iterator iterator = numberList.iterator();while (iterator.hasNext()){if(iterator.next().equals(element)){numberList.remove(element);}}
//异常如下
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)at java.util.LinkedList$ListItr.next(LinkedList.java:888)at com.Test.ListTest.main(ListTest.java:22)

正确的删除方式有三种:

1.正序for循环删除,由于删除后List中的元素会前移一位,所以我们首先i--将指针移到被前移的元素上,再将数组长度-1,防止指针越界

        for(int i = 0,j = numberList.size();i < j;i++){if(numberList.get(i).equals(element)){numberList.remove(element);j--;i--;}

2.倒序for循环删除,List由最后一位向前循环,每次移除元素,指针都会前移一位,总移动次数也与数组长度相同

        for(int i= numberList.size()-1;i >= 0;i--){if(numberList.get(i).equals(element)){numberList.remove(element);}}

3.迭代器删除,该方法与错误迭代器方法的不同就是需要采用迭代器的remove()方法,而不是List中的remove(Object o)方法

        Iterator iterator = numberList.iterator();while (iterator.hasNext()){if(iterator.next().equals(element)){iterator.remove();}}

List删除与另一List相同元素的方法

上面说完了简单情况下的List循环删除,实际开发中情况可能更为复杂,需要根据两集合中,元素同名同类型属性值相同,去移除其中一个集合中的元素

1.有集合a和集合b,现在需要将a从移除a与b的子集,如果集合中的元素可以用"=="或者"equals()"方法判定是否相同,那么可以使用List中提供的removeAll(Collection c)方法,该方法可以将a中的a与b子集含有的元素全部删除,缺点是执行效率较低

        //生成1-100的随机数,集合aList<Long> numberList = new LinkedList<>();for(int i = 0 ; i < 10 ; i++){numberList.add((long)(Math.random()*100+1));numberList.add(10L);}Long element = 10L;//集合bList<Long> targetList = new LinkedList<Long>();targetList.add(element);numberList.removeAll(targetList);System.out.println(numberList);

2.当情况更为复杂,无法使用equals()方法判断两元素是否相同,或者根据两元素各自的某项属性值判断是否需要移除时,则需要使用双重循环,逐条进行对比,为防止指针越界异常,当移除了元素后,需调整指针位置和循环次数。此处我使用倒序删除的方式,可以避免手动移动指针。值得注意的是:内层循环每次判断元素属性值相同,做移除操作后,必须中断循环,这样指针前移后,又重新循环集合b,避免漏删和空指针的情况。

for(int i = heroes.size()-1;i >= 0;i--){for(int j = idols.size()-1;j >=0;j--){if(heroes.get(i).getBrave() == idols.get(j).getBrave()){heroes.remove(i);break;}}}//执行结果如下
集合a:
[Name:tom  Brave100, Name:tony  Brave50, Name:tony  Brave20, Name:tom  Brave100, Name:tony  Brave50, Name:tony  Brave20]
集合b:
[Name:kk  Brave20, Name:kk  Brave20, Name:cc  Brave50]
删除后的集合a:
[Name:tom  Brave100, Name:tom  Brave100]

3.迭代器实现的方法,运行结果和上面for循环方法的结果相同,缺点是必须使用引用指向强转后的iterator.next(),优点是不用思考指针如何移动

        while (heroeIterator.hasNext()){while (idolIterator.hasNext()){Hero h = (Hero)heroeIterator.next();Idol i = (Idol)idolIterator.next();if(h.getBrave() == i.getBrave()){heroeIterator.remove();}}}

List删除指定元素以及List删除与另一List相同元素的方法相关推荐

  1. ThinkPHP删除指定文件(物理删除) 点击链接可查看详情(对学习可有很大的帮助的...

    ThinkPHP删除指定文件(物理删除)   点击链接可查看详情(对学习可有很大的帮助的 转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/18/2 ...

  2. ThinkPHP删除指定文件(物理删除)

    ThinkPHP删除指定文件(物理删除)   点击链接可查看详情(对学习可有很大的帮助的) 转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/18/ ...

  3. Unity3D中删除指定路径的文件+删除文件夹

    目录 一.目的 1.想知道:Unity3D中删除Application.streamingAssetsPath里面的文件 1.想知道:unity删除文件夹 二.参考 1.unity 文件和文件夹的创建 ...

  4. java 删除指定字符_字符串删除指定位置字符 JAVA 删除字符串中指定的字符

    <死侍2>有多不按套路出牌? 要CSS布局HTML小编今天和大家分享用到函数的调用. 编制函数fun,其功能是:删除一个字符串中指定的一.问题描述:从键盘输入一个字符串给str和一个字符给 ...

  5. linux文件删除指定内容,Linux bash删除文件中含“指定内容”的行功能示例

    本文实例讲述了Linux bash删除文件中含"指定内容"的行功能.分享给大家供大家参考,具体如下: #!/bin/sh # 功能: 删除文件中含"指定内容"的 ...

  6. php删除指定符号,利用PHP删除特殊符号

    在编程的时候,不管你是偏向PHP等较为简单的编程,还是说想Java等更需要逻辑的强类型语言编程,都会或多或少地接触到对特殊符号的处理.特殊符号虽然显得不怎么起眼,但却极有可能会让程序实现不了初衷的目的 ...

  7. python dataframe删除指定行_pandas.DataFrame删除/选取含有特定数值的行或列

    pandas.DataFrame删除/选取含有特定数值的行或列 发布时间:2018-06-20 09:13, 浏览次数:9726 , 标签: pandas DataFrame 1.删除/选取某列含有特 ...

  8. php 删除指定html标签,php删除html标签的三种解决办法

    分享下PHP删除HTMl标签的三种方法. 方法1: 直接取出想要取出的标记 function strip($str) {$str=str_replace(" ","&qu ...

  9. C语言如何编程实现删除指定文件,c语言删除指定目录下的所有文件

    复制内容到剪贴板 代码:#include #include #include #include #include #include //判断是否是".."目录和".&qu ...

  10. 微信小程序云数据库-删除指定数据

    小程序数据库上传上次已经讲过了,这次写点删除指定id的数据,在网上找了半天,结果都是妖魔鬼怪什么代码都有,但是没有能用的,所以还是推荐看官方的文档:官方文档 官方文档是最准确的,而且小程序也刚刚兴起, ...

最新文章

  1. JS获取系统时间--JavaScript基础
  2. Android开发二 什么是Android
  3. oracle基础授权,Oracle基础学习3--Oracle创建用户并授权
  4. python中逻辑回归结果怎么看_python – 为什么statsmodels不能重现我的R逻辑回归结果?...
  5. 小网站架构优化-提升抗并发能力:子应用程序分离方案
  6. 探索 OpenStack 之(7):Neutron 深入探索之 Open vSwitch (OVS) + GRE 之 Neutron节点篇
  7. $_SERVER[HTTP_HOST]和$_SERVER[SERVER_NAME]
  8. error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
  9. 渗透测试web安全 - webshell 免杀 绕过waf总结
  10. 解决windows7系统netmeeting无法(安装)使用问题
  11. 物联网行业的现状与思考
  12. 看大神如何用python爬虫爬取京东商品评论
  13. 算法分享: 动态规划之拱桥回文算法
  14. 【毕设记录】第一篇:开题,整体App计划
  15. 我的世界服务器群系修改,我的世界创世神教程 第五十五节修改选区的生物群系|功能介绍|难点介绍|这节...
  16. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(五)之使用RabbitMQ缓存消息
  17. CPT模型:一种中文兼顾NLU和NLG的非平衡预训练语言模型
  18. 读书笔记 - 学会写作: 五个吸引人的情节套路
  19. 把文字转换成拼音工具类
  20. 机场航班保障系统总体设计

热门文章

  1. rust海上有个油井_常用的工业用语英语单词
  2. Photoshop操作总结(一)
  3. uniapp showModal与bind(this)
  4. 立捷科技:淘宝店铺运营小技巧分享
  5. 2021年焊工(初级)找解析及焊工(初级)模拟考试题库
  6. opendaylight-O版本与openstack集成
  7. linux内存管理-系统调用brk()
  8. 不求人的笔记本键盘修理维护方法
  9. Android Studio(0)开发开篇 环境搭建 创建工程 2020.3.1版本 虚拟手机
  10. SolrSpringDataSolr