`
LynBazinga
  • 浏览: 11133 次
社区版块
存档分类
最新评论

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

阅读更多

 

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

 

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);
	}
	
	

}

 

分享到:
评论

相关推荐

    Java面试宝典-经典

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    JAVA面试题最全集

    数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的...

    java面试题大全(2012版)

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    Java面试宝典2010版

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    java面试宝典2012

    各种java面试题集,面试前必备哦, 1. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 8 2、Java有没有goto? 8 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套...

    Java基础部分 Java代码查错算法与编程html&JavaScript&ajax部分面试题

    这个资源不太新,但是,对于...65、去掉一个Vector集合中重复的元素 2 66、Collection 和 Collections的区别。 2 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 2

    最新Java面试宝典pdf版

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    关于JAVA面试的100题及其答案

    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...

    Java面试宝典2012新版

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    Java面试笔试资料大全

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    JAVA面试宝典2010

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...

    Java面试宝典2012版

    65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类...

    java猜数字源码-Android_Interview:Android面试题

    java猜数字源码 Android面试整理 阿里巴巴 LRUCache原理 答: 图片加载原理 模块化实现(好处,原因) JVM 视频加密传输 统计启动时长,标准 答: 如何保持应用的稳定性 ThreadLocal 原理 答: 谈谈classloader  答...

    Java 面试宝典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...... 7 2、Java 有没有 goto? .......................................................................................................

Global site tag (gtag.js) - Google Analytics