一道java面试题---去除list中的指定元素_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 一道java面试题---去除list中的指定元素

一道java面试题---去除list中的指定元素

 2014/11/27 18:33:46  LynBazinga  程序员俱乐部  我要评论(0)
  • 摘要:一道比较简单的java面试题,一个list中存放string,例如存放人名,而且这个list的size比较大,现在要求去除该list中的名字为姓“张”的所有元素,至今没有想到很好的方法,自己只知道三种方法,求大神给予更好的答案,性能越高越好,谢谢~importjava.util.ArrayList;importjava.util.ConcurrentModificationException;importjava.util.Iterator;importjava.util.List
  • 标签:面试 JAVA面试题 Java面试 list Java 面试题

?

? 一道比较简单的java面试题,一个list中存放string,例如存放人名,而且这个list的size比较大,现在要求去除该list中的名字为姓“张”的所有元素,至今没有想到很好的方法,自己只知道三种方法,求大神给予更好的答案,性能越高越好,谢谢~

?

class="java" name="code">import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import org.junit.Before;

public class ModifyList {
	
	public List<String> lists=null;
	
        String[] prefixName = new String[]{"赵","钱","孙","李","张","陈"};
	
	String[] suffixName = new String[]{"子涵","心怡","子墨","梦瑶","浩轩","轩","俊熙","可馨","睿","思彤","思诚","丹"};
	
	@Before
	public void before(){
		lists=new ArrayList<String>();
		Random random=new Random();
		int i=0;
		while(i<50000){
			int prefix=random.nextInt(6);
			int suffix=random.nextInt(12);
			String name=prefixName[prefix]+suffixName[suffix];
			lists.add(name);
			i++;
		}
	    
	}
	
	
	@org.junit.Test(expected=ConcurrentModificationException.class)
	public void remove1(){
		for(String name:lists){
			if(name!=null&name.indexOf("张")>-1){
				lists.remove(name);
			}
		}
		System.out.println(lists);
	}
	
	/**
	 * 该方法适用于去除唯一一个不合适的值,效率最高
	 */
	@org.junit.Test
	public void remove2(){
		for(String name:lists){
			if(name!=null&name.indexOf("张")>-1){
				lists.remove(name);
				break;
			}
		}
		System.out.println(lists);
	}
	
	/**
	 * 该方法没有报错,因为每次都去获取lists.size
	 * 不会抛出ConcurrentModificationException异常
	 * 但如果连续的list中有连续的姓张的在一起,就会出现不删除现象
	 * 当i=0时,删除“张三”,此时“张九”的下标变为0,i=1,此时就不会对“张九”做处理
	 */
	@org.junit.Test
	public void remove3(){
		for(int i=0;i<lists.size();i++){
			if(lists.get(i)!=null&lists.get(i).indexOf("张")>-1){
				lists.remove(i);
			}
		}
		System.out.println(lists);
	}
	
	/**
	 * 正确方法一
	 */
	@org.junit.Test
	public void remove4(){
		long begin=System.currentTimeMillis();
		System.out.println(begin);
		Iterator<String> iters = lists.iterator();
		while(iters.hasNext()){
			String name=iters.next();
			if(name!=null&name.indexOf("张")>-1){
				iters.remove();
			}
		}
		long end=System.currentTimeMillis();
		System.out.println(end);
		System.out.println(end-begin);
		/*System.out.println(lists);*/
	}
	
	/**
	 * 正确方法二
	 */
	@org.junit.Test
	public void remove5(){
		 
		long begin=System.currentTimeMillis();
		System.out.println(begin);
		for(int i=0;i<lists.size();i++){
			if(lists.get(i)!=null&lists.get(i).indexOf("张")>-1){
				lists.remove(i);
				i--;
			}
		}
		long end=System.currentTimeMillis();
		System.out.println(end);
		System.out.println(end-begin);
		//System.out.println(lists);
	}
	
	/**
	 * 正确方法三,效率最高,其实不算去除
	 */
	@org.junit.Test
	public void remove6(){
		List<String> list2=new ArrayList<String>();
		long begin=System.currentTimeMillis();
		System.out.println(begin);
		for(String name:lists){
			if(name!=null&name.indexOf("张")<0){
				list2.add(name);
			}
		}
		long end=System.currentTimeMillis();
		System.out.println(end);
		System.out.println(end-begin);
		//System.out.println(list2);
	}
	
	

}

?

发表评论
用户名: 匿名