`
dongliwei122
  • 浏览: 81425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

集合比较算法(Java)

阅读更多
最近做了一个小测试,对两个集合的比较,目的是想删除出两个集合相同的数据。
分别用List、Map、和Set进行测试
利用List比较
10000用户的数据(6000相同的用户,4000不同的用户),完成比较的时间共耗时1531毫秒
100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时143735毫秒

利用Map比较
10000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时172毫秒
100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时359毫秒

利用Set比较
10000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时78毫秒
100000用户的数据(60000相同的用户,40000不同的用户),完成比较的时间共耗时156毫秒

package com.test;

/**
 * 进行比较的基础数据对象
 * <br>
 *文件名:User.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 9:06:26 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class User {

	private String name = "";
	private String id = "";
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getKey(){
		return this.name + "&" + this.id;
	}
	
	public int hashCode(){
		int hash = 1;
		hash += this.id.hashCode();
		hash += this.name.hashCode();
		return hash;
	}
}

package com.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

/**
 * 主要用于初始化集合(其中List的数据是从Map中获取是因为数据在Map中是无序的)
 * <br>
 *文件名:CreateUser2.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 9:33:17 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class CreateUser2 {

	public static Map UserMapA = new HashMap();
	public static Map UserMapB = new HashMap();
	
	
	public static HashSet UserSetA = new HashSet();
	public static HashSet UserSetB = new HashSet();
	
	public static List UserListA = new ArrayList();
	public static List UserListB = new ArrayList();
	
	public static int aa = 60000;//相同的用户数
	public static int bb = 40000;//不相同的用户数
	
	public static void CreateUserList(){
		
		String name = "张三";
		int count = 0;
		//制作600个相同的用户
		for(int i = 0 ; i < aa ;i++){
	        User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserListA.add(user);
	        UserListB.add(user);
	        count++;
		}
		//制作400个不相同的用户
		int test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserListA.add(user);
	        count++;
		}
		test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserListB.add(user);
	        count++;
		}
	}
	
	public static void CreateUserMap(){
		
		String name = "张三";
		int count = 0;
		//制作600个相同的用户
		for(int i = 0 ; i < aa ;i++){
	        User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserMapA.put(user.getKey(), user);
	        UserMapB.put(user.getKey(), user);
	        count++;
		}
		//制作400个不相同的用户
		int test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserMapA.put(user.getKey(), user);
	        count++;
		}
		test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserMapB.put(user.getKey(), user);
	        count++;
		}
	}
	
	public static void CreateUserSet(){
		
		String name = "张三";
		int count = 0;
		//制作600个相同的用户
		for(int i = 0 ; i < aa ;i++){
	        User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserSetA.add(user);
	        UserSetB.add(user);
	        count++;
		}
		//制作400个不相同的用户
		int test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserS[b][/b]etA.add(user);
	        count++;
		}
		test = count;
		for(int i = test ; i < bb +test ;i++){
			User user = new User();
	        user.setId(i+"");
	        user.setName(name+i);
	        UserSetB.add(user);
	        count++;
		}
	}
}

package com.test;

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

/**
 * 对List测试
 * <br>
 *文件名:Test.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 8:16:21 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class TestList {

	public static void execute(){
		
		List test = new ArrayList();
		for(int  i = 0 ; i < CreateUser2.UserListA.size();i++){
			test.add(CreateUser2.UserListA.get(i));
		}
		CreateUser2.UserListA.removeAll(CreateUser2.UserListB);
		CreateUser2.UserListB.removeAll(test);
	}
	
	public static void main(String[] args) {
		long begin = new Date().getTime();
		CreateUser2.CreateUserList();
		long end = new Date().getTime();
		System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");
		System.out.println("运算前");
		System.out.println("CreateUser2.UserListA.size()=" + CreateUser2.UserListA.size());
		System.out.println("CreateUser2.UserListB.size()=" + CreateUser2.UserListB.size());
		begin = new Date().getTime();
		execute();
		end = new Date().getTime();
		System.out.println("比较用户共耗时" + (end - begin) + "毫秒");
		System.out.println("运算后");
		System.out.println("CreateUser2.UserListA.size()=" + CreateUser2.UserListA.size());
		System.out.println("CreateUser2.UserListB.size()=" + CreateUser2.UserListB.size());
	}

}

package com.test;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.test.CreateUser2;

/**
 * 对Map测试<br>
 *文件名:Test.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 8:16:21 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class TestMap {

	public static void execute(){
		
		
		//备份用户组b
		Map m = new HashMap();
		Iterator itt = CreateUser2.UserMapB.entrySet().iterator();
        while (itt.hasNext()) {
            Map.Entry entry = (Map.Entry) itt.next();
            Object key = entry.getKey(); 
            Object value = entry.getValue(); 
            m.put(key, value);
        }
        
        Iterator it = CreateUser2.UserMapA.entrySet().iterator();
		int count = 0;
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            Object key = entry.getKey(); 
            if(CreateUser2.UserMapB.get(key)!= null){
            	count++;
            	CreateUser2.UserMapB.remove(key);
            }
        }
        Iterator itm = m.entrySet().iterator();
        while (itm.hasNext()) {
            Map.Entry entry = (Map.Entry) itm.next();
            Object key = entry.getKey(); 
            if(CreateUser2.UserMapA.get(key)!= null){
            	count++;
            	CreateUser2.UserMapA.remove(key);
            }
        }
        System.out.println(count);
	}

	public static void main(String[] args) {
		long begin = new Date().getTime();
		CreateUser2.CreateUserMap();
		long end = new Date().getTime();
		System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");
		System.out.println("运算前");
		System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapA.size());
		System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapB.size());
		begin = new Date().getTime();
		execute();
		end = new Date().getTime();
		System.out.println("比较用户共耗时" + (end - begin) + "毫秒");
		System.out.println("运算后");
		System.out.println("CreateUser2.UserMapA.size()=" + CreateUser2.UserMapA.size());
		System.out.println("CreateUser2.UserMapB.size()=" + CreateUser2.UserMapB.size());
	}

}

package com.test;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 对Set测试<br>
 *文件名:TestSet.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:Mar 25, 2009 9:40:40 PM<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public class TestSet {

	public static void execute(){
		
		
		//备份用户组b
		Set m = new HashSet();
		Iterator itt = CreateUser2.UserSetA.iterator();
        while (itt.hasNext()) {
        	User user = (User) itt.next();
            m.add(user);
        }
        CreateUser2.UserSetA.removeAll(CreateUser2.UserSetB);
        CreateUser2.UserSetB.removeAll(m);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long begin = new Date().getTime();
		CreateUser2.CreateUserSet();
		long end = new Date().getTime();
		System.out.println("形成模拟数据共耗时" + (end - begin) + "毫秒");
		System.out.println("运算前");
		System.out.println("CreateUser2.UserSetA.size()=" + CreateUser2.UserSetA.size());
		System.out.println("CreateUser2.UserSetB.size()=" + CreateUser2.UserSetB.size());
		begin = new Date().getTime();
		execute();
		end = new Date().getTime();
		System.out.println("比较用户共耗时" + (end - begin) + "毫秒");
		System.out.println("运算后");
		System.out.println("CreateUser2.UserSetA.size()=" + CreateUser2.UserSetA.size());
		System.out.println("CreateUser2.UserSetB.size()=" + CreateUser2.UserSetB.size());
	}

}
分享到:
评论
7 楼 myworkfirst 2009-07-07  
   是否真正都删除了相同的数据,有待怀疑。

认真检查下User类
6 楼 wangichao 2009-07-07  
不错学习了!
5 楼 aninfeel 2009-04-01  
无序或单向肯定比不上有序多向的,真要比的话应该把添加的时间也计算在内。
4 楼 allenny 2009-03-31  
我还以为是DNA的算法呢
3 楼 Eastsun 2009-03-30  
引用
#     public int hashCode(){ 
#         int hash = 1; 
#         hash += this.id.hashCode(); 
#         hash += this.name.hashCode(); 
#         return hash; 
#     }

这个hashcode很强大~~
2 楼 mewleo 2009-03-28  
避免比较对象,还是比数字好。
1 楼 duooluu 2009-03-28  
ArrayList内部是一个数组,删除后还要将后面的元素向前移动
HashSet内部也是一个HashMap,你后面两个测试相差一倍,TestMap应该还能优化

相关推荐

    JAVA 经典算法书集合(1)

    JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1),JAVA 经典算法集合(1)JAVA 经典算法集合(1),JAVA 经典...

    集合划分算法java源码

    集合划分算法是组合数学中的一个重要概念,主要用于将一个集合分成两个或多个互不相交的子集。...通过深入研究源码,不仅可以学习到集合划分的算法实现,还能提升Java编程技巧,尤其是处理递归和回溯问题的能力。

    JAVA 经典算法书集合(2)

    JAVA 经典算法书集合(2),JAVA 经典算法书集合(2),JAVA 经典算法书集合(2),JAVA 经典算法书集合(2),JAVA 经典算法书集合(2),JAVA 经典算法书集合(2),JAVA 经典算法书集合(2)JAVA 经典算法书集合...

    常用算法集合(c与java语法)

    本教程“常用算法集合(c与java语法)”涵盖了多种经典算法,并提供了C和Java两种编程语言的实现,为学习者提供了丰富的学习资源。无论你是初学者还是有经验的开发者,都能从中受益。 首先,让我们了解一下“常用算法...

    java版本大数据各种算法集合

    本资料集专注于"java版本大数据各种算法集合",涵盖18种经典的大数据挖掘算法及其代码实现。下面将详细讨论这些算法以及它们在实际应用中的作用。 首先,决策树(Decision Tree)是一种监督学习算法,常用于分类...

    Similarity 文本比对程序java文本比较算法

    2. **Java文本比较算法**:在Java中,实现文本比对通常涉及字符串操作,如`equals()`、`contains()`等方法,但更复杂的比对需求会使用特定的算法。例如,Jaccard相似度、余弦相似度、Levenshtein距离等。 3. **...

    java经典算法合集

    Description: Java经典算法java经典算法java经典算法java经典算法java经典算法java经典算法java经典算法java经典算法 Tags: Java经典算法 Java经典算法合集是Java编程语言中的一些经典算法的集合,这些算法涵盖了...

    模糊匹配算法java实现

    Java作为一种流行的编程语言,提供了丰富的库和工具来实现各种模糊匹配算法。本篇将深入探讨如何使用Java实现模糊匹配,并介绍一些核心的概念和技术。 首先,我们要理解模糊匹配的基本原理。模糊匹配是指在两个字符...

    JAVA算法题目集合.pdf

    这个文件中的Java算法题目集合涵盖了多个经典算法和编程问题,适合用来提升编程能力和算法理解。以下是对这些题目知识点的详细解释: 1. **最大公约数与最小公倍数**:求两个数的最大公约数(GCD)和最小公倍数...

    java算法全卷(包括基本算法和图算法)

    Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...

    Java数据挖掘常见18种算法实现和10种常见排序算法以及其他相关经典DM算法集合.zip

    Java数据挖掘18大算法实现和10大常见排序算法以及其他相关经典DM算法集合。 18大数据挖掘的经典算法以及代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面,后面都是相应算法的文章,希望能够...

    经典算法Java实现

    本资源“经典算法Java实现”为Java学习者和研究人员提供了一套完整的算法实现集合,旨在帮助他们更好地理解和运用这些算法。 一、排序算法 1. 冒泡排序:基础排序算法,通过不断交换相邻的逆序元素来逐步理顺数组...

    匈牙利算法java实现

    通过Java实现匈牙利算法,我们可以解决很多实际问题,如分配任务、调度资源、匹配市场等。在实际应用中,可能还需要对算法进行优化,例如采用早停策略,当达到一定匹配数量时停止搜索,或者在大型图中使用并行化方法...

    FP树增长算法的java实现

    在Java中实现FP树算法,我们可以按照以下步骤进行: 1. **数据预处理**:首先,我们需要对原始数据进行预处理,将交易数据转换为事务ID和项ID的形式,即每条记录表示一个交易,其中包含交易中出现的所有项。 2. **...

    JAVA算法题目集合程序习题:

    【JAVA算法题目集合程序习题】是一系列针对Java编程者设计的练习,旨在提升编程思维能力和代码编写技巧。这些题目涵盖了基础、深入和综合三种难度级别,覆盖了数学、逻辑和数据结构等多个方面。 1. **基础题**: -...

    电梯调度算法(java实现)

    在这个Java实现中,我们将深入探讨电梯调度算法的基本原理、常见策略以及如何在Java编程环境中进行模拟。 电梯调度算法的核心目标是有效地服务楼层数字上的请求,以减少乘客的等待时间和电梯的移动距离。这个过程...

    计算几何求凸包算法的java实现

    从描述来看,此Java实现可能采用了Andrew's Monotone Chain或Jarvis March,因为它们比较适合处理动态更新的点集,且效率相对较高。 1. **Graham's Scan**:首先找到一个最低点,然后按顺时针或逆时针方向排序其余...

    java kmeans聚合算法

    Java KMeans聚类算法是一种广泛应用的数据挖掘技术,用于将数据集分成不同的组或“簇”,使得同一簇内的数据点彼此相似,而不同簇之间的数据点差异较大。在本例中,描述提到了从Pascal语言转换到Java实现,这意味着...

    KNN算法java实现

    在Java实现中,可能还会利用集合框架(如ArrayList、HashSet等)来存储样本和它们的类别,以及排序算法(如快速排序或堆排序)来找到最近的邻居。同时,为了提高效率,可能会使用KD树或球树等数据结构来加速近邻搜索...

    java 核心知识 包含 JVM 线程 集合 数据库 算法 负载等一系列

    本文将深入探讨Java的核心知识,包括JVM(Java虚拟机)、线程、集合、数据库、算法以及负载均衡等多个方面。 首先,让我们从Java虚拟机(JVM)开始。JVM是Java程序运行的基石,它负责解析字节码并执行。理解JVM的...

Global site tag (gtag.js) - Google Analytics