一个手机号码剔重的问题
问题
现有2个待推广手机号码数据文件,A文件1000W行,B文件是100W,文件中每行记录只有手机号,号码有重复,请设计高效方案先对A、B数据文件分别进行号码剔重,再找出B文件中在A文件存在的号码,请写出核心设计思想,并编写代码完整实现。(注:请用纯c实现,不许采用数据库、Memcached等第三方中间件,号码数据文件请自行模拟生成)答题要求:请同时提供Word设计文档,和程序源代码(如程序中使用了第三方Jar请注明,jar包请不要上传),打包上传。
思路及分析
号码剔重步骤
package art.programming.algorithm;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Writer; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set;import org.junit.Test;public class BigFileSpliter {private Map<String, Writer> fileWriterMap = new HashMap<String, Writer>();public void split(File file) throws IOException{ InputStream is; BufferedReader br; String line; is = new FileInputStream(file); br = new BufferedReader(new InputStreamReader(is));while((line = br.readLine()) != null){ //System.out.println(line); append(line.substring(0,3)+".txt", line); } closeAllWriters(); br.close(); is.close(); }public void append(String fileName, String appendStr) throws IOException{if (!fileWriterMap.containsKey(fileName)){ File file = new File(fileName); if(!file.exists()){ file.createNewFile(); } FileWriter fw = new FileWriter(file); fileWriterMap.put(fileName, fw); } fileWriterMap.get(fileName).write(appendStr); fileWriterMap.get(fileName).write('\n'); }public void closeAllWriters(){ for(Writer fw : fileWriterMap.values()){ try { fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ try { fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }public List<String> getAllFileNames(){ Set<String> keys = fileWriterMap.keySet(); List<String> klist = new ArrayList<String>(); for (String key : keys){ klist.add(key); }Collections.sort(klist); return klist; }@Test public void testSplit() throws IOException{ new BigFileSpliter().split(new File("cellphone.txt")); } }
第二步,将文件按照文件名排序,依次读取文件中的电话号码
package art.programming.algorithm;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;public class BigFileSort {private final static int RANGE = 32; private int[] bitMap;private File outputFile; private File inputFile; private int bitMapLen = (99999999/RANGE) + RANGE; FileWriter fw;public BigFileSort(String inputFileName, String outputFileName) throws IOException{ bitMap = new int[bitMapLen]; outputFile = new File(outputFileName); if (outputFile.exists()){ outputFile.delete(); } outputFile.createNewFile(); inputFile = new File(inputFileName); fw = new FileWriter(outputFile); }public void sortAndOutput() throws IOException{ BigFileSpliter bigFileSpliter = new BigFileSpliter(); bigFileSpliter.split(inputFile); for (String fileName : bigFileSpliter.getAllFileNames()){ readAndSetBitMap(fileName); output(fileName.substring(0, 3)); } //Clean up fw.close(); }private void readAndSetBitMap(String fileName) throws IOException{ InputStream is; BufferedReader br; String line; is = new FileInputStream(fileName); br = new BufferedReader(new InputStreamReader(is)); while((line = br.readLine()) != null){ long tmp = Long.parseLong(line.substring(3, 11)); int mod = (int) tmp / RANGE; int offset = (int) tmp % RANGE; int bit = bitMap[(int)mod]; if (getBit(bit, offset) != 1){ bit = setBit(bit, offset, 1); bitMap[(int)mod] = bit; }else{ System.out.println(fileName.subSequence(0, 3) + toStringRep(tmp) + " duplicates!"); } } br.close(); is.close(); }private void output(String prefix) throws IOException{for (int i=0; i< bitMapLen; i++){ for (int offset=0; offset<RANGE; offset++){ if (getBit(bitMap[i], offset) == 1){ long tmp = i * RANGE + offset; String cellphoneNum = toStringRep(tmp); fw.write(prefix+cellphoneNum); fw.write("\n"); } } }for (int i=0; i< bitMapLen; i++){ bitMap[i] = 0; } }private String toStringRep(long tmp){ String cellphoneNum = String.valueOf(tmp); if (cellphoneNum.length()<8){ StringBuilder sb = new StringBuilder(); for (int j=0; j< 8 - cellphoneNum.length(); j++){ sb.append('0'); } sb.append(cellphoneNum); cellphoneNum = sb.toString(); } return cellphoneNum; }private int getBit(int signinNum, int bitIndex) { if( (signinNum & ( 1 << bitIndex)) != 0){ return 1; } return 0; }private int setBit(int num, int bitIndex, int zeroOrOne){ if (zeroOrOne == 1){ num = num | (1 << bitIndex); }else{ num = num - (1 << bitIndex); } return num; }//整体测试以下 @Test public void testSort() throws IOException{ long begin = System.currentTimeMillis(); new BigFileSort("cellphone.txt", "sortedCellphone.txt").sortAndOutput(); System.out.println(System.currentTimeMillis() - begin); } }
整个过程,事件花费大约60秒左右
手机号码交集
转载于:https://www.cnblogs.com/cando/p/3201351.html
一个手机号码剔重的问题相关推荐
- gmail注册手机号不能用于验证_一个手机号码、辅助邮箱,可以注册绑定多少个gmail帐号?...
点击上方云中栖居关注 ▲ 先说答案,据Google专家回复, 一个手机号码最多绑定10个Google帐号. 之前每当有喜欢的邮箱名称,就会注册一个谷歌邮箱帐号,应该有二十多个了吧,丢弃了一些,目前仅在 ...
- 用java设计一个文件查重程序,输入两个文本文件,输出两个文本文件的重复率(最长公共子序列的应用)...
你可以使用java代码来设计一个文件查重程序.首先,你需要读取两个文本文件的内容,将它们存储在字符串变量中.然后,你可以使用最长公共子序列(LCS)算法来计算两个字符串的重复率. LCS算法的实现方法 ...
- 一个全基因组重测序分析实战
Original 2017-06-08 曾健明 生信技能树 这里选取的是 GATK best practice 是目前认可度最高的全基因组重测序分析流程,尤其适用于 人类研究. PS:其实本文应该属于 ...
- linux 把一个文件夹重命名后,移动到另外一个文件夹下
linux 把一个文件夹重命名后,移动到另外一个文件夹下 mv /ssd1/AAA/PBMC_rat/RAT/index /ssd1/zhihengfeng/PBMC_rat/star
- 小飞鱼通达OA二开 使用微信企业号做一个用户自助重设密码的开发(图文)
通达OA用的多了,你有没有忘记过密码呢?怎么办,一遍一遍登录都不对,试过几次就被锁在外面了,万般无奈只能求助管理员来给清空密码了. 这时候就体现出管理员的权利了,来,我给你清下密码,分分钟搞定. 这样 ...
- linux中如何复制文件并重命名_linux 下怎么复制一个文件到另外一个目录并且重命名...
在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...
- 一个简单的重命名,在git中也有这么多学问
重命名如何在git中高效的完成呢? $ pwd$ ll$ cd git-rainbow/$ ll$ cd mtxcrm/$ ls -la 所有的工作先在工作区(或工作目录)里面进行操作,然后再加到暂存 ...
- 懒人动手,用python做一个基础翻译重命名器(破解百度翻译反爬手段)
想法: 在做开发的时候,经常需要命名各种变量,方法/函数,类,包,库等. 走一遍流程就是:想好要起的名字,比如"非常帅气": 然后上翻译网站,比如百度翻译,有道翻译: 将中文输入并 ...
- 原来还有这样一个东西,重来不知道过-linux ,ulimit
点击打开链接 功能说明:控制shell程序的资源. 语 法:ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>] ...
最新文章
- 东北育才 数论专场第2场
- 内存(Display)、显示器(Monitor)和计算机(Computer)均属于一种产品(Product),其中计算机需要显示器和内存。请用Python语言简要实现这些类及它们之间的关系。
- WIN10 软连接释放c盘空间
- nodejs+html转换pdf,Nodejs 中将html转换成pdf文件
- Linux下C程序进程地址空间布局
- (32) css—opcity属性
- 用Java动态代理实现AOP
- [20171106]配置客户端连接注意.txt
- 小程序 长按转发_小程序转发分享
- 思科CEO自爆:G20虚拟会议用的我家技术
- 自己动手制作USB启动盘
- pygame实现王思聪吃热狗小游戏(双人版)
- ARP表和MAC表的区别
- 笔记本电脑电源和电池充电管理电路设计
- Android Studio开发记录
- javascript版的等额本息计算器
- 前端开发-CSS快速掌握上手知识详细总结
- ImmunoChemistry艾美捷总细胞毒性试验试剂盒方案
- sqlyog恢复查询记录
- linux学习笔记之lvm管理
热门文章
- 【NLP】XLnet:GPT和BERT的合体,博采众长,所以更强
- python安装pyquery失败
- 从上百幅架构图中学大型网站建设经验(上)
- 控制 WebBrowser 控件的外观和行为
- android 数组赋值字符串_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...
- 对话尹成杰三农谋定压舱石-农业大健康·万祥军:稳农保供
- 2019.7.16 网络层协议与应用
- MySQL 高可用架构 之 MHA (Centos 7.5 MySQL 5.7.18 MHA 0.58)
- rpm批量卸载所有带有Java的文件
- js,jquery获取页面元素距离浏览器工作区顶端的距离