日期:2014-05-20  浏览次数:20801 次

遇到一个问题,给点建议,随机生成7-13位的整数,不能出现前缀码
编写程序随机生成1,000,000条不同的电话号码:
(1) 号码长度从7位到13位不等。
(2) 电话号码必须为前缀码,即一个号码不能是另一个号码的前半部分。如0104568,010456897就不是一组合格的电话号码。

大家给点建议,我无从下手,在线等

------解决方案--------------------
Java code

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();
  }
}