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]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值