List 循环删除方法

 如果要循环删除List中的某些元素,例如删除值都是‘a’的元素,如果使用普通的for循环,很容易就会会漏删或者报错。

package com.pdnev;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.junit.Before;
import org.junit.Test;


public class RemoveList {
	List<String> list;
	
	//准备数据
	@Before
	public void setData(){
		list = new ArrayList<String>();
		list.add("a");list.add("b");list.add("c");list.add("a");list.add("b");list.add("b");list.add("d");list.add("c");list.add("c");list.add("d");list.add("c");
	}
	
	//测试正确的方法
	@Test
	public void removeElement(){
		System.out.println("原始数据: "+ Arrays.asList(list));
		
		//从后向前删除
		for(int i = list.size()-1;i>=0;i--){
			if(list.get(i).equals("a"))	list.remove(i);
		}
		System.out.println("删除a后: "+ Arrays.asList(list));
		
		//Iterator 删除
		Iterator<String> it = list.iterator();
		while(it.hasNext()){
			String s = it.next();
			if(s.equals("b")) it.remove(); //不可以使用list.remove
			
		}
		System.out.println("删除b后: "+ Arrays.asList(list));
		
		//会漏掉的删除
		for(int i = 0;i<list.size();i++){
			if(list.get(i).equals("c"))  list.remove(i);
		}
		System.out.println("删除c后: "+ Arrays.asList(list));
		
		int size = list.size();
		for(int i = 0;i<size;i++){
			if(list.get(i).equals("d"))  list.remove(i);
		}
	}
}

执行结果:



可以看到,第一种使用从后向前删除是没有问题的。第二种使用Iterator 删除也是没问题的。

但是删除c 这一行的输出就有问题,仍然有c。 这是使用普通的for循环删除,会漏删,另外,如果size不是每次都去获取,会报越界异常。

如果使用 增强for的时候。会报ConcurrentModificationException异常

(因为对junit不熟悉,所以代码使用了junit练习下)

猜你喜欢

转载自pdnev.iteye.com/blog/2396346
今日推荐