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

一道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工程师面试题大全-100%公司笔试题你都能碰到几个

    ### Java工程师面试题知识点解析 #### 一、Hibernate中离线查询去除重复项 - **问题**: Hibernate中如何在离线查询中去除重复项? - **解决方案**: 在Hibernate的Criteria API中,可以通过调用`...

    BATjava面试含答案

    本文总结了 BAT 面试中常见的 Java 面试题,涵盖了 List、Map、String 等基本数据结构和面试题,旨在帮助读者更好地了解 BAT 面试的常见问题。 一、List 相关知识点 1. List 是有序的,ArrayList 和 LinkedList 是...

    Java面试宝典-经典

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

    java工程师面试题

    Java工程师面试题主要涵盖多个Java基础知识领域,包括但不限于语法、框架、网络协议、文件操作、Servlet、数据库管理和数据结构。以下是对这些知识点的详细解析: 1. Hibernate中的离线查询去除重复项: Hibernate...

    2023一线互联网大厂Java面试题集

    这份"2023一线互联网大厂Java面试题集"是为那些正在寻找跳槽机会,特别是对Java技术有深入理解和应用的初中高级开发者精心准备的。它包含了来自百度、阿里、字节跳动等知名企业的最新面试题目,涵盖了广泛的Java核心...

    java面试题总结

    ### Java面试题总结 #### 一、MVC框架与MySQL索引 - **MVC框架**:MVC(Model-View-Controller)是一种常见的软件架构模式,用于将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)...

    企业java面试题(笔试+面试)

    【Java基础知识】 1. **Java基本类型**:Java有8种基本数据类型,包括布尔型(boolean)、字符型(char)、字节型(byte...以上是Java面试中常见的知识点,深入理解这些基础概念对于解决实际问题和通过面试至关重要。

    java 面试题 面试题

    从给定的文件信息中,我们可以提取出一系列与Java编程语言相关的面试知识点,这些...以上知识点覆盖了Java面试中经常被问及的基础和进阶概念,理解并掌握这些知识将有助于加深对Java语言特性的了解,并提高面试成功率。

    直击面试系列_破解Java面试题_全

    本资料“直击面试系列_破解Java面试题_全”显然是为了帮助求职者准备这些常见的Java面试问题。 首先,我们来看看Java的基础知识。Java语法基于C++,但去除了指针等易出错的特性,引入了垃圾回收机制来自动管理内存...

    华为java面试题

    ### 华为Java面试题知识点解析 #### 一、Java面向对象基础 1. **super()与this()的区别** - `super()`用于调用父类的构造方法或父类中的成员方法。 - `this()`用于调用本类中的其他构造方法。 2. **作用域public...

    Java面试题精选与解析.md

    ### Java面试题精选与解析知识点概览 #### 一、Java基础知识 - **Java的特点和优势**: - 平台无关性:Java程序可以在任何安装了Java虚拟机(JVM)的操作系统上运行,无需修改。 - 面向对象:Java是一种纯面向...

    Java面试题集附答案

    // 定义下标,模拟已经去掉一个元素,因此从-1开始 // 循环移除元素,直到只剩一个 while (dataList.size() &gt; 1) { index = (index + k) % dataList.size(); // 移动k步 dataList.remove(index); // 移除元素 ...

Global site tag (gtag.js) - Google Analytics