`
lizhenbin2010
  • 浏览: 101280 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

List循环删除元素方法

 
阅读更多

       最近在写项目要对一个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并删除某个元素的方法

    以下将详细介绍如何在C#中遍历List并删除元素,包括正序和倒序遍历的技巧。 首先,我们来看一下错误的遍历方式。通常,开发者可能会本能地使用for循环来遍历List,如下所示: ```csharp for (int i = 0; i &lt; list....

    java中循环删除list中元素的方法总结

    这里我们将详细讨论几种不同的循环遍历和删除元素的方法,以及它们的适用场景。 1. **常规for循环**: ```java for (int i = 0; i &lt; list.size(); i++) { if (list.get(i).equals("del")) { list.remove(i); }...

    浅析jquery数组删除指定元素的方法:grep()

    在JavaScript中,原生提供的`splice()`方法是一种常用的方式,它通过指定的索引位置来删除元素。然而,在某些情况下,使用`splice()`方法可能会得到不符合预期的结果,比如在原数组上直接修改,返回被删除的元素,而...

    基于list循环删除元素,迭代器失效的问题详解

    在上述代码中,我们可以看到两个不同的循环,第一个循环仅仅打印元素,而第二个循环试图删除元素并更新迭代器。 在第二个循环中,`it`和`ittemp`都是迭代器,`it`用于前进到下一个元素,`ittemp`则用于存储当前要...

    Java 实例 - List 循环移动元素源代码+详细指导教程.zip

    迭代器是Java集合框架提供的一种统一的遍历方式,它可以安全地删除元素,而不会抛出ConcurrentModificationException。以下是一个使用迭代器移动元素的例子: ```java List&lt;String&gt; list = new ArrayList(); // ...

    java集合类arraylist循环中删除特定元素的方法.docx

    为了解决上述问题,可以在每次删除元素后调整循环控制变量或列表大小,以确保遍历过程的正确性: ```java for (int i = 0; i &lt; list.size(); ) { if (list.get(i).equals(XXX)) { list.remove(i); } else { i++...

    HashMap和List遍历方法及如何遍历删除元素总结

    HashMap和List遍历方法及如何遍历删除元素总结 HashMap和List都是Java中最常用的数据结构,它们都可以用来存储和操作数据。然而,在遍历和删除元素时,需要小心地处理,以免出现问题。下面总结了HashMap和List的...

    Python中list循环遍历删除数据的正确方法

    前言 初学Python,遇到过这样的问题,在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: ...原因是在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照

    正确遍历删除List中的元素方法(推荐)

    1. **通过增强的for循环删除元素** - **问题**:在增强的for循环(foreach)中直接删除元素会导致`ConcurrentModificationException`,因为这种方式不允许修改正在迭代的集合。 - **示例**: ```java for ...

    删除List中的重复值

    方法一:循环元素删除 // 删除ArrayList中重复元素 public static void removeDuplicate(List list) { for ( int i = 0 ; i &lt; list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j &gt; i; j -- ) {...

    C#在foreach遍历删除集合中元素的三种实现方法

    在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...

    Python list列表中删除多个重复元素操作示例

    本文实例讲述了Python list列表中删除多个重复元素操作。分享给大家供大家参考,具体如下: 我们以下面这个list为例,删除其中所有值为6的元素: l=[9,6,5,6,6,7,8,9,6,0] 首先尝试remove方法: l.remove(6) ...

    Python实现列表删除重复元素的三种常用方法分析

    本文实例讲述了Python实现列表删除重复元素的三种常用方法。分享给大家供大家参考,具体如下: 给定一个列表,要求删除列表中重复元素。 listA = ['python','语','言','是','一','门','动','态','语','言'] 方法1...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    这种方法通过获取集合的Iterator,并在循环中使用`iterator.remove()`方法删除元素,避免了并发修改的问题。 ```java List&lt;CheckWork&gt; list = this.getUserDao().getAll(); Iterator&lt;CheckWork&gt; chk_it = list....

    C#查找列表中所有重复出现元素的方法

    `List&lt;T&gt;`是.NET框架提供的一个泛型类,它实现了`IList&lt;T&gt;`、`ICollection&lt;T&gt;`和`IEnumerable&lt;T&gt;`接口,提供了动态数组的功能,允许我们方便地添加、删除和查找元素。对于查找重复元素,我们通常会遍历列表,比较每...

    简单的ListCtrl多行删除

    在实际应用中,直接在循环中删除元素可能会导致一些问题,例如,删除项后,原先的索引可能不再有效,导致逻辑错误。为了解决这个问题,通常有两种方法: - **逆序删除**:即从列表的末尾开始向前删除,这样可以避免...

    在list集合中输入元素,去除重复的元素并输出

    需要注意的是,这里使用`iterator.remove()`而不是`list.remove()`来删除元素,这可以避免并发修改异常。 ### 三、使用HashSet特性去除重复元素 这种方法利用了HashSet的特性,即HashSet不允许有重复的元素。将...

Global site tag (gtag.js) - Google Analytics