最近在写项目要对一个List集合元素不需要的某些元素删除,遇到循环批量删除结果和预期的不对,之后查看了jdk源码才解决问题,所以没事看看源码还是好处多多,记录一下,以后碰到可以翻出来看看。
package com.okhqb.mode.singleton; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 测试List批量删除集合元素 * * 说明: 1、removeByListIndex(list1)和removeByListElements(list2)方法; * 直接调用ArryList的remove()方法不能循环批量删除List的集合元素,源码如下: public E remove(int index) { RangeCheck(index); modCount++; E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; } 2、removeByIterator(list3)通过list的Iterator接口循环可以直接remove()掉元素 可以完成批量循环删除ArrayList集合元素任务 3、removeByTempList(list4)通过创建临时集合记录需要删除元素信息,其实也是调用Iterator接口循环可以直接remove() 可以完成批量循环删除ArrayList集合元素任务,源码如下AbstractCollection: public boolean removeAll(Collection<?> c) { boolean modified = false; Iterator<?> e = iterator(); while (e.hasNext()) { if (c.contains(e.next())) { e.remove(); modified = true; } } return modified; } * * @author Zhenbin.Li * */ public class RemoveListElements { /** 测试List集合长度 */ private static final int TEST_REMOVE_SIZE = 20; /** 单例 */ private static RemoveListElements instance = null; private RemoveListElements() {}; public static synchronized RemoveListElements getInstance() { if (instance == null) { instance = new RemoveListElements(); } return instance; } /** * 三种不同的方式执行删除List元素,比较输出结果 */ public void doRemove() { List<String> list1 = new ArrayList<String>(TEST_REMOVE_SIZE); List<String> list2 = new ArrayList<String>(TEST_REMOVE_SIZE); List<String> list3 = new ArrayList<String>(TEST_REMOVE_SIZE); List<String> list4 = new ArrayList<String>(TEST_REMOVE_SIZE); for (int i = 0; i < TEST_REMOVE_SIZE; i++) { list1.add(String.valueOf(i)); list2.add(String.valueOf(i)); list3.add(String.valueOf(i)); list4.add(String.valueOf(i)); } try { removeByListIndex(list1); removeByListElements(list2); removeByIterator(list3); removeByTempList(list4); } catch (RuntimeException ex) { System.out.println("error message=" + ex.getMessage()); throw ex; } catch (Exception ex) { ex.printStackTrace(); } } /** * 通过List集合索引删除List集合元素信息 * * @param list list集合 */ protected void removeByListIndex(List<String> list) { doValidParams(list); for (int index = 0; index < list.size(); index++) { if (index % 2 == 0) { list.remove(index); } } System.out.println("removeByListIndex, List Elements=" + list); } /** * 通过List元素值删除List集合元素信息 * * @param list list集合 */ protected void removeByListElements(List<String> list) { doValidParams(list); for (int index = 0; index < list.size(); index++) { if (index % 2 == 0) { list.remove(String.valueOf(index)); } } System.out.println("removeByListElements, List Elements=" + list); } /** * 通过Iterator值删除List集合元素信息 * * @param list list集合 */ protected void removeByIterator(List<String> list) { doValidParams(list); for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { String listValue = iterator.next(); if (Integer.valueOf(listValue) % 2 == 0) { iterator.remove(); } } System.out.println("removeByIterator, List Elements=" + list); } /** * 通过临时List集合值删除List集合元素信息 * * @param list list集合 */ protected void removeByTempList(List<String> list) { doValidParams(list); List<String> deleteElements = new ArrayList<String>(); for (int index = 0; index < list.size(); index++) { if (index % 2 == 0) { deleteElements.add(list.get(index)); } } list.removeAll(deleteElements); System.out.println("removeByTempList, List Elements=" + list); } /** * 校验删除List参数 * * <p>参数校验失败抛出异常,不做打印信息</p> * @param list 校验list集合 */ private void doValidParams(List<String> list) { if (null == list || list.size() <= 0) { throw new RuntimeException("Remove List Null."); } } public static void main(String[] args) { RemoveListElements.getInstance().doRemove(); } }
运行结果:
removeByListIndex, List Elements=[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19] removeByListElements, List Elements=[1, 3, 5, 7, 9, 11, 13, 14, 15, 16, 17, 18, 19] removeByIterator, List Elements=[1, 3, 5, 7, 9, 11, 13, 15, 17, 19] removeByTempList, List Elements=[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
相关推荐
主要介绍了C#遍历List并删除某个元素的方法,实例分析了正序与倒序遍历list及删除元素的使用技巧,需要的朋友可以参考下
下面小编就为大家带来一篇java中循环删除list中元素的方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
下面小编就为大家带来一篇基于list循环删除元素,迭代器失效的问题详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
前言 初学Python,遇到过这样的问题,在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: ...原因是在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照
方法一:循环元素删除 // 删除ArrayList中重复元素 public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) {...
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...
本文实例讲述了Python list列表中删除多个重复元素操作。分享给大家供大家参考,具体如下: 我们以下面这个list为例,删除其中所有值为6的元素: l=[9,6,5,6,6,7,8,9,6,0] 首先尝试remove方法: l.remove(6) ...
下面小编就为大家带来一篇java中循环遍历删除List和Set集合中元素的方法(推荐)。小编觉得挺不错的,在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文实例讲述了Python实现列表删除重复元素的三种常用方法。分享给大家供大家参考,具体如下: 给定一个列表,要求删除列表中重复元素。 listA = ['python','语','言','是','一','门','动','态','语','言'] 方法1...
在本篇文章中小编给大家分享了关于HashMap和List遍历方法及如何遍历删除元素知识点总结,需要的朋友们参考下。
我们直接先给出输出与预期不同的代码 In[28]: a = [1,2,3,4,5,6...同理,使用list.pop()函数删除指定元素的时候,也会出现上述情况,如: In[33]: a = [1,2,3,4,5,6] In[34]: for index, value in enumerate(a): ...
删除给定索引的数据元素。 给定索引index ,数据元素x,将x插入到index的位置。 C++:设计一个结构体struct chainNode,再设计一个具体类 class doubleChain 作为抽象类 class linearList的派生类实现类linearList中...
在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_list)): ...解决方案:倒序循环删除 num_list = [1, 2, 3, 4,
remove()方法从列表中删除第一个obj。 语法 以下是remove()方法的语法: list.remove(obj) 参数 obj — 这是可以从列表中移除该对象 返回值 此方法不返回任何值,但从列表中删除给定的对象 例子 下面的例子显示了...
与不同,在这些循环中添加和删除元素不会引发异常。 在当前循环位置之后添加元素时,循环将继续进行处理,就好像它们从一开始就存在一样。 当前循环位置之前添加的元素将被跳过。 在当前循环位置之前删除的元素...
本文实例讲述了Python简单删除列表中相同元素的方法。分享给大家供大家参考,具体如下: 去除列表中重复的元素,非常简单,直接上代码: a = [11, 21, 3, 4, 3, 2, 5] b = list(set(a)) print(a) print(b) 运行...
循环链表的API及实现,包含:循环链表的数据结构、创建循环链表、销毁一个循环链表、清空一个循环链表、返回循环链表的长度、插入一个元素、返回一个元素、按位置删除一个元素、按结点值删除一个元素、重置游标指向...