日期:2014-05-20 浏览次数:20801 次
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(); } }