日期:2014-05-20 浏览次数:20994 次
import java.util.*;
/**
* 随机生成1,000,000条不同的电话号码:
* (1) 号码长度从7位到13位不等。
* (2) 电话号码必须为前缀码,即一个号码不能是另一个号码的前半部分。如0104568,010456897就不是一组合格的电话号码。
* @author autumn (http://blog.csdn.net/autumnhealth)
* @version 1.0
*/
public class RamTelNumTest {
/**
* 默认情况下,最多只能生成197000条左右的满足条件的号码。超过这个数字,会报内存不足。
* 要生成更多的号码,可以指定JVM的参数,例如:
* 如果要生成100万条号码,可以用以下命令来运行:
* java -Xms400m -Xmx400m RamTelNumTest
* @param args
*/
public static void main(String[] args) {
Set<String> aSet = createTelNum(198000, 7, 13);
//取消以下注释可以按照字符串顺序在控制台打印生成的号码,但必须花费更多的时间。
/*
TreeSet aTreeSet = new TreeSet(aSet);
Iterator iterator = aTreeSet.iterator();
while(iterator.hasNext()) {
System.out.println("电话号码:\t"+iterator.next());
}
*/
}
/**
* 随机生成num条不同的电话号码,位数在minDigit到maxDigit之间,
* 以字符串的形式存储在一个Set集合中,并返回此Set集合。
* @param num 要生成的号码条数
* @param minDigit 最小位数
* @param maxDigit 最大位数
* @return 满足条件的字符串集合
*/
public static Set<String> createTelNum(int num, int minDigit, int maxDigit) {
Set<String> rs = new HashSet<String>();
Set<String> tmp = new HashSet<String>();
while(rs.size()<num) {
String sNum = createRandom(minDigit, maxDigit);
boolean bCheck = false;
for(int iEnd=sNum.length(); iEnd >= 7; iEnd--) {
boolean bCheck2 = tmp.add(sNum.substring(0, iEnd));
if(iEnd == sNum.length() && bCheck2)
bCheck = true;
if(!bCheck2) break;
}
if(bCheck) rs.add(sNum);
}
return rs;
}
/**
* 随机生成一个位数在minDigit到maxDigit之间的数,以字符串的形式返回
* @param minDigit 最小位数
* @param maxDigit 最大位数
* @return 一个位数在minDigit到maxDigit之间的数的字符串
*/
public static String createRandom(int minDigit, int maxDigit) {
Random ran1 = new Random();
Random ran2 = new Random();
int a = 0;
while(a <= minDigit) {
a = ran1.nextInt(maxDigit);
}
StringBuffer sb = new StringBuffer();
for(int i=0; i<a; i++) {
int b = ran2.nextInt(10);
sb.append(String.valueOf(b));
}
return sb.toString();
}
}