这个是自己写的算法,如果有大牛,麻烦帮我并行化。初学者则可以学到不少东西。

产生测试用例

import java.io.*;
import java.util.Random; public class ProduceCase { public static void main(String[] argvs){
File file2 = new File("D:\\YounG\\TestCases\\MySet\\test.txt");
FileWriter fw = null;
BufferedWriter writer = null;
try {
fw = new FileWriter(file2);
writer = new BufferedWriter(fw);
for(int i = 0; i < 500000; i++){
StringBuilder stringBuilder = new StringBuilder();
Random random = new Random();
for(int j = 0; j < random.nextInt(21); j++){
String s = getRandomString();
if(" ".equals(s)&&s.isEmpty()) continue;
stringBuilder.append(s + " ");
}
writer.write(stringBuilder.toString());
writer.newLine();//换行
}
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String getRandomString( ) { //length表示生成字符串的长度
Random random = new Random();
StringBuilder sb = new StringBuilder();
int length = random.nextInt(10);
for (int i = 0; i < length; i++) {
int number = random.nextInt(26);
sb.append(String.valueOf((char) (number+65) ));
}
return sb.toString();
}
}

  合并集合:

import java.io.*;
import java.util.*; public class MapTest {
public static void main(String[] argvs) {
File file = new File("D:\\YounG\\TestCases\\MySet\\test.txt");
BufferedReader reader = null;
List<HashSet> mySets = new ArrayList<>(500000);
boolean hasEmpty = false;
try {
reader = new BufferedReader(new FileReader(file));
String tempString;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
// 显示行号
Scanner scanner = new Scanner(tempString);
HashSet<String> mySet = new HashSet<>();
mySet.clear();
while (scanner.hasNext()) {
mySet.add(scanner.next());
}
scanner.close();
//对个集合内部进行排序,定义大小。放弃排序。
if (mySet.isEmpty() && !hasEmpty) hasEmpty = true;
else
mySets.add(mySet);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
} List<Integer> destList = new ArrayList<>(mySets.size());
int setsSize = mySets.size();
for (int i = 0; i < setsSize; ++i) {
destList.add(i);
}
Map<String,Integer> mergeMap = new HashMap<>(1000000); //合并图。 long startTime=System.currentTimeMillis(); //获取开始时间 for (int setId = 0; setId < mySets.size(); ++setId) {
Iterator<String> iterator = mySets.get(setId).iterator();
List<String> setElem = new ArrayList<>(50);//先把元素全部迭代出来,避免了多线程错误。
while (iterator.hasNext())
setElem.add(iterator.next());
int elemNumOfSet = setElem.size();
for(int j = 0; j < elemNumOfSet; j++) {
if( mergeMap.containsKey( setElem.get(j) ) ) { //判断当前元素是否包含在合并记录表里边。永远不要用直接下标访问(伪下标)
Integer destValueSetId = destList.get( mergeMap.get( setElem.get(j) ).intValue() ); //真实 的包含该元素的最小集合号。
Integer destLoopSetId = destList.get(setId);
if( destValueSetId.compareTo( destLoopSetId ) > 0 ) {
// Iterator putIterator = mySets.get(destValue).iterator();
// while (putIterator.hasNext())
// mergeMap.put((String) putIterator.next(), destList.get(setId)); //找过的元素记得入mergeMap。
mySets.get( destLoopSetId ).addAll( mySets.get(destValueSetId) );//Set中元素增多,所以iterator失效,故重新复制。且Hash 存储本身就是无序的,随着元素的增加是会改动存储顺序的。
//推测,HashSet与HashMap不同HashSet不过就是所有的Value是一个固定的地址罢了。而HashMap分为了Value和Key两个集合。
mySets.get( destValueSetId ).clear();
for (int i = 0; i < destList.size(); i++) {
if ( destList.get(i).equals( destValueSetId ) ) {
destList.set(i, destLoopSetId );
}
}
}
else if(destValueSetId.compareTo( destLoopSetId ) < 0) {
// Iterator putIterator = mySets.get(destValue).iterator();
// while (putIterator.hasNext())
// mergeMap.put((String) putIterator.next(), destValue); //找过的元素记得入mergeMap。
mySets.get( destValueSetId ).addAll( mySets.get(destLoopSetId));
mySets.get( destLoopSetId ).clear();
for (int i = 0; i < destList.size(); i++) {
if ( destList.get(i).equals( destLoopSetId )) {
destList.set(i, destValueSetId);
}
}
}
}
else {
mergeMap.put( setElem.get(j) , setId ); //此处切记不可用destList.get(iSet),因为该值并不稳定。
}
}
} long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); Iterator iterator = mySets.iterator();
File file2 = new File("D:\\YounG\\TestCases\\MySet\\testACK.txt");
FileWriter fw = null;
BufferedWriter writer = null;
try {
fw = new FileWriter(file2);
writer = new BufferedWriter(fw);
while(iterator.hasNext()){
HashSet<String> temp = (HashSet<String>) iterator.next();
if(!temp.isEmpty()) {
writer.write( temp.toString() );
writer.newLine();
}
}
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

验证输出结果:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern; /**
* Created by Young on 2015/12/25.
* 如何测试测试用例:
* 1.所有的元素不重复,/hashSet
* 2.元素的种类不减少,/count
* 3.没有非法合并。(非法合并指,合并过程中,不存在共同元素依然合并),这一项适合在合并程序必然实现。
* 3 must be true since contains and addAll execute as the same time.
*/
public class Validaty {
public static void main(String[] args) {
File file = new File("D:\\YounG\\TestCases\\MySet\\testACK.txt");
BufferedReader reader = null;
Set allSet = new HashSet<String>();
//int count1 = 0;
try {
reader = new BufferedReader(new FileReader(file));
String tempString;
// 一次读入一行,直到读入null为文件结束
allSet.clear();
while ((tempString = reader.readLine()) != null) {
// 显示行号
tempString = tempString.substring(1,tempString.length()-1);
//Pattern pattern = Pattern.compile(",");
String[] strings = tempString.split(", ");
int strj = 0;
while (strj < strings.length && !strings[strj].isEmpty()){
if (allSet.contains(strings[strj])) {
System.out.println("Wrong ACK for \"" + strings[strj] + "\" is repeated");
return;
}
allSet.add(strings[strj]);
strj++;
}
/* Scanner scanner = new Scanner(tempString);
while (scanner.hasNext()) {
String temp = scanner.next();
if (allSet.contains(temp)) {
System.out.println("Wrong ACK for " + temp + "is repeated");
return;
}
allSet.add(temp);
//++count1;
}
scanner.close();*/
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
} File file2 = new File("D:\\YounG\\TestCases\\MySet\\test.txt");
BufferedReader reader2 = null;
try {
reader2 = new BufferedReader(new FileReader(file2));
String tempString;
// 一次读入一行,直到读入null为文件结束 while ((tempString = reader2.readLine()) != null) {
// 显示行号
Scanner scanner = new Scanner(tempString);
while (scanner.hasNext()) {
String temp = scanner.next();
if (!allSet.contains(temp)) {
System.out.println("Wrong ACK for lost elem " + temp);
return;
}
}
scanner.close();
}
reader2.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
} System.out.println("Right ACK");
}
}

最完整的合并相交集合的Java代码(查并集)的更多相关文章

  1. JAVA 代码查错

    1.abstract class Name { private String name; public abstract boolean isStupidName(String name){}} 大侠 ...

  2. Java代码查错部分?

    1. abstract class Name { private String name; public abstract boolean isStupidName(String name) {} } ...

  3. java代码中后台向前台传递list或map集合案例

    导入jar包 新建一个servert传递map集合 ajax.java代码: package servlet; import java.io.IOException; import java.io.P ...

  4. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.5——在flavors间合并java代码

    问题: 你想要在单独的product flavors里面增加Acitivity或者其它java类. 解决方案: 创建合适的代码目录,增加java类,将它们和main代码合并. 讨论: flavors和 ...

  5. 关于Hash集合以及Java中的内存泄漏

    <学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报  分类: 学习笔记(5)  版 ...

  6. java集合系列——java集合概述(一)

    在JDK中集合是很重要的,学习java那么一定要好好的去了解一下集合的源码以及一些集合实现的思想! 一:集合的UML类图(网上下载的图片) Java集合工具包位置是java.util.* 二:集合工具 ...

  7. c++ 集合的增删改查,与两集合的合并 缺陷(空间大小不灵活)

    #if 1 #include <iostream> #include <stdlib.h> using namespace std; class List { public: ...

  8. scala集合与java集合的转换应用

    今天在业务开发中遇到需要Scala集合转为Java集合的场景: 因为业务全部是由Scala开发,但是也避免不了调用Java方法的场景,所以将此记录下来加深记忆: import scala.collec ...

  9. C# Net 合并int集合为字符串,如:输入1,2,3,4,8 输出1~4,8

    C# Net 合并int集合为字符串,如:输入1,2,3,4,8 输出1~4,8 粘贴代码使用: /// <summary> /// 合并int集合,如1,2,3,4,8 输出1~4,8 ...

随机推荐

  1. 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览

    ### 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览 http://segmentfault.com/a/1190000002583569

  2. 通过开发工具发布web应用到tomcat服务器中--对于小白,大神可以忽略不看,勿喷,谢谢

    需要的工具 MyEclipse和TomCat 本人用的是MyEclipse2014和TomCat7 TomCat结构图 第一步:在MyEclipse中配置TomCat 如图所示: 第二步:创建Web项 ...

  3. 购买SSD固态硬盘须当心,你知道什么是SLC、 MLC、TLC闪存芯片颗粒吗?

    固态硬盘凭借其存取速率超快等自身优势,被越来越多的电脑爱好者所青睐,并迅速普及到了广大用户的电脑中,因为固态硬盘与传统机械硬盘相比,确实在运行效率等方面有了质的提升,但是亦是美网络小编要提醒大家的是, ...

  4. 请问JAVA三层架构,持久层,业务层,表现层,都该怎么理解?和MVC三层模型有什么区别

    持久层用来固化数据,如常说的DAO层,操作数据库将数据入库业务层用来实现整体的业务逻辑 如 前台获得了数据,逻辑层去解析这些数据,效验这些数据等操作表现层很好解释  你现在看到的网页 一些界面 都属于 ...

  5. Quarzt.NET的Cron表达式理解

    网上关于Quarzt.NET的Cron表达式介绍有很多,但都是基本的语法,稍微深入一些的就没有了. 基本语法介绍请参看: http://www.cnblogs.com/lzrabbit/archive ...

  6. linq 中的分组查询

    直接看代码: //一个字段分组 var data1 = from a in query group a by a.Name into b select new { Total = b.Sum(c=&g ...

  7. 跟着老男孩一步步学习Shell高级编程实战

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...

  8. oracle的学习 第二节:创建数据表

    学习内容: A.创建数据库和表空间 B.创建用户和分配权限 C.创建数据表 一.创建数据库和表空间 (一)SQL语言的基本概念 1.概念 高级的结构化查询语言:沟通数据库服务器和客户的重要桥梁. PL ...

  9. ios&h5混合开发项目仿app页面跳转优化

    前言:本人原本是ios开发工程师,但由于现今H5的兴起,行内刮起了一阵混合开发的风气,趁着这股劲,我也学了前端开发,不说研究的多深,但也能胜任日常的开发工作.长话短说,现今的混合开发应该还处于摸索阶段 ...

  10. C#中的面向对象编程

    所有的面向对象语言都具有3个基本特征,C#也是不例外的. 封装---把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性: 继承---通过继承可以复用父类的对象: 多态---允许将子对象赋值给 ...