`
inkbread
  • 浏览: 772 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

多线程找出两个list之间不同的元素

 
阅读更多
突然之间,给自已想到了一题,找出两个list之间的不同元素。
尝试了用list循环 或 用hashSet 实现,但效率都太低了点。
如是尝试了一下用多线程去实验一下,效率大大提升 。。


import java.util.ArrayList;
import java.util.List;

/**
 * @author gah
 *
 * 2013-7-3
 */
public class CompareListThread {
	
	private List minList, maxList , retList;
	
	public CompareListThread(List list1, List list2) {
		if(list1.size() > list2.size()) {
			maxList = list1;
			minList = list2;
		} else {
			maxList = list2;
			minList = list1;
		}
		retList = new ArrayList();
	}
	
	private int getInterval() {
		return maxList.size()/10;
	}
	
	public void execute() throws Exception{
		int start, t;
        start = t = getInterval();
		ACT act = null;
		List<ACT> list = new ArrayList<ACT>();
		while(start < maxList.size()) {
			act = new ACT(start - t,start);
			start += t;
			act.start();
			list.add(act);
		}
		act = new ACT(start-t, maxList.size());
		act.start();
		list.add(act);
		for(ACT a:list) {
			a.join();
			retList.addAll(a.getResult());
		}
	}
	
	public List getResult() {
		return retList;
	}
	
	class ACT extends Thread {
		private List  rList;
		private int s, e;
		
		public ACT(int s, int e) {
			this.s = s; 
			this.e  = e;
			rList = new ArrayList();
		}
		
		@Override
		public void run() {
			Object o = null;
			for(;s < e; s++) {
				o = maxList.get(s);
				for(int i = 0,j=minList.size(); i < j; i++) {
					if(o == minList.get(i)) {
						o = null;
						break;
					}
				}
				if(null != o) {
					rList.add(o);
				}
			}
		}
		
		public List getResult() {
			return rList;
		}
		
	}

}


private static List compareSet(List list1, List list2) {
		long a = System.currentTimeMillis();
		List retList = new ArrayList();
		List minList;
		Set set = null;
		if(list1.size() > list2.size()) {
			set = new HashSet(list1);
			minList = list2;
		} else {
			set = new HashSet(list2);
			minList = list1;
		}
		set.removeAll(minList);
		System.out.println("compare2 method take time:" + (System.currentTimeMillis() - a));
		Iterator iter = set.iterator();
		while(iter.hasNext()) {
			retList.add(iter.next());
		}
		return retList;
	}



private static List compareList(List list1, List list2) {
		long a = System.currentTimeMillis();
		List retList = new ArrayList();
		List minList = list1 , maxList = list2;
		if(list1.size() > list2.size()) {
			maxList = list1;
			minList = list2;
		}
		for(int i = 0, count = maxList.size(); i < count; i++) {
			if(!minList.contains(maxList.get(i))) {
				retList.add(maxList.get(i));
			}
		}
		System.out.println("compare method take time:" + (System.currentTimeMillis() - a));
		return retList;
	}
分享到:
评论

相关推荐

    两个集合比较(新增、编辑、删除)

    当我们需要找出两个List之间的差异,即在第二个List中新增的元素时,可以使用`ArrayList`或`LinkedList`的`containsAll()`方法。如果第二个List包含第一个List不包含的所有元素,则这些元素是新增的。例如: ```...

    多线程集合及IO面试

    3. **找出重的小球问题**: - 对于这个问题,可以通过两次称重来解决: 1. 将8个小球分成三组,两组各有3个球,一组有2个球。 2. 先将两个含有3个球的组进行称重比较。如果重量相同,则较重的小球一定在未被称重...

    比较两个数据库之间的差异

    在IT行业中,数据库是存储和管理数据的核心工具,它们在各种业务系统中扮演着至关重要的角色。有时,我们可能需要比较两个...通过精心设计的程序,我们可以有效地找出数据库之间的差异,从而确保数据的一致性和准确性。

    java 集合和数组的详细总结(并随着讲解带9个例子)

    8. **集合的并发操作**:在多线程环境中,使用ConcurrentHashMap等并发安全的集合。 9. **集合的流式处理**:Java 8引入的Stream API,对集合进行函数式编程。 通过这些例子,你可以深入理解Java集合和数组在实际...

    查找数组中最接近与某值的元素 python

    然而,这两个函数并不能直接找到最接近目标值的元素。 3. **自定义函数**:由于Python的标准库没有直接提供寻找最接近值的函数,我们需要编写自己的函数。一种常见的方法是遍历数组,比较每个元素与目标值的差值,...

    Java中Collection、List、Set、Map之间的关系总结

    例如,涉及到堆栈、队列等操作,使用List接口,快速插入和删除应使用LinkList,随机访问元素使用ArrayList单线程使用非同步类,多线程使用同步类。注意对HashTable的操作,作为Key的对象要覆写equals和hashCode方法...

    获取进程信息类,监控进程变化线程

    可以设置一定的间隔时间,如500毫秒,然后调用`get_process_list()`更新进程列表,通过比较新旧列表找出变化。当发现新进程时,可以触发一个事件或者回调函数,通知主程序进行进一步处理。 为了实现这个功能,我们...

    C#实现AddRange为数组添加多个元素的方法

    以及如何移动数组元素到指定位置,或比较两个数组找出相同或不同的元素。 在C#编程中,掌握这些基本的集合操作和算法技巧对于提高代码质量、效率和可维护性至关重要。不断学习和实践,你将能够更好地应对各种编程...

    集合框架的各自区别.pdf

    它包括List和Set两个子接口。List接口要求元素保持特定的顺序,允许重复元素;Set接口不允许重复元素,不保证元素顺序。 1. List接口:ArrayList、LinkedList和Vector是List接口的实现。ArrayList基于数组实现,...

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

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    prime-numbers:找出从 0 到 n 的所有素数。 两种实现

    在这个主题中,我们将深入探讨如何用Java语言找出从0到n的所有素数,以及两种不同的实现方法。 **一、素数的定义** 素数(也称为质数)是指大于1且除了1和其本身以外没有其他正因数的自然数。例如,2、3、5、7、11...

    Day17 Java 集合和泛型.pdf

    在处理Map时,例如需要找出map中出现次数最多的键,可以使用遍历map的values()方法返回的Collection集合,然后通过遍历这个集合来实现。例如,可以遍历值的集合,对每个值进行计数,然后找出计数最高的键。 本知识...

    2021字节跳动面试参考手册.pdf

    - B树和红黑树都是平衡树,但B树的节点可以有多于两个子节点,而红黑树每个节点最多有两个子节点。 14. AVL树和红黑树的区别。 - AVL树是高度平衡的二叉搜索树,而红黑树在保持大致平衡的同时,插入和删除操作的...

    python之collections模块(csdn)————程序.pdf

    Python的`queue`模块提供了一种FIFO(先进先出)的数据结构,常用于多线程之间的同步。`Queue`类是队列的基本实现,可以通过`put()`方法添加元素,`get()`方法获取并移除元素。当队列为空时,`get()`会阻塞,直到有...

    Python道面试题及答案共48道.docx

    1. **找出两个列表中相同的元素和不同的元素**: 这个问题涉及到列表操作。通过列表推导式,我们可以快速找到两个列表`list1`和`list2`中相同的元素(`sim`)和不同的元素(`diff`)。列表推导式是Python中简洁的...

    Python面试题及答案共48道.docx

    1. **找出两个列表中相同的元素和不同的元素**: 使用列表推导式,可以轻松找到两个列表的交集(相同元素)和并集(不同元素)。 ```python list1 = [1, 2, 3, 5, 8, 7, 11, 10] list2 = [5, 15, 25, 10] sim =...

    求素数 C# windows窗体

    这个练习的核心目标是编写一个程序,它能接收两个数字作为输入,然后找出并显示这两个数字之间所有的质数。 质数是大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。例如,2、3、5、7、11、13等都是质数...

    DirBuster-0.12.zip

    这个软件的主要功能是通过枚举大量的目录和文件名来找出网站或服务器上未公开的隐藏路径,这些路径可能包含敏感信息或者未授权的后台入口。标题中的"DirBuster-0.12.zip"表明这是一个版本为0.12的DirBuster压缩包,...

Global site tag (gtag.js) - Google Analytics