生成由a-z和0-9组成的一到五个字符长度的字符串

时间:2014-03-11 20:09:19

标签: java permutation

我想生成所有可能的字符串,从长度1到长度5,由字符a-z和0-9组成。

我发现了可能对我有帮助的代码片段,但我仍然坚持修改它们以实现我的需要。

我在SO上找到的这段代码将使用a-z和0-9,1679216字符串产生长度为4的所有可能的字符串组合。

public static void generate(){
    int MAX = 36;
    long count = 1L * MAX * MAX * MAX * MAX;

    int counter = 0;
    char[] alphabet = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
    int[] digits = new int[4];
    char[] output = "0000".toCharArray();

        for (int i= 0; i < count; i++){
            String name = String.valueOf(output);

            for(int d =  3; d >=0; --d){
                digits[d] = (digits[d] + 1) % MAX;
                output[d] = alphabet[digits[d]];
                if (digits[d] > 0){
                    break;
                }
            }
            counter++;
            System.out.println(name);
        }
    System.out.println(counter);
}

现在这不是我所需要的,但它很接近,也许我可以让它发挥作用!我已尝试通过以下方式修改它,但是存在索引问题,无处不在抛出ArrayOutBounds异常。思考过程是,我可以将整个块包装在另一个for循环中,处理数字和输出的大小,从1到5。我修改的时间越多,它得到的丑陋越多,我就越多思考,“必须有一个更清洁的方式”。

public static void generate(){
    int MAX = 36;
    long count = 1L * MAX * MAX * MAX * MAX * MAX;

    String build = null;
    int counter = 0;
    char[] alphabet = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
    int[] digits = null;
    char[] output = null;

    for (int j = 1; j < 5; j++){
      build = null; //clear build
      digits = null; //clear digits
      outputs = null; //clear outputs
      digits = new int[j]; //initialize digits to size j

      //small loop to append "0" to build 
      for (int m = 0; m < j; m++){
          build = build + "0";
      }
      output = build.toCharArray(); //convert our string to charArray

        for (int i= 0; i < count; i++){
            String name = String.valueOf(output);

            for(int d =  3; d >=0; --d){
                digits[d] = (digits[d] + 1) % MAX;
                output[d] = alphabet[digits[d]];
                if (digits[d] > 0){
                    break;
                }
            }
            counter++;
            System.out.println(name);
        }
    }
    System.out.println(counter);
}

2 个答案:

答案 0 :(得分:2)

您需要修改行

    long count = 1L * MAX * MAX * MAX * MAX * MAX; // one more * MAX

    ...

    int[] digits = new int[5]; // from [4]
    char[] output = "00000".toCharArray(); // from 0000

    ...

            for(int d =  4; d >=0; --d){ // from d = 3

更一般地说,如果n是位数,

    long count = 1L;
    for( int i=0; i<n; i++ ) count *= MAX;

    ...

    int[] digits = new int[n];
    char[] output = new char[n];
    Arrays.fill( output, '0' );

    ...

            for(int d = n-1; d >=0; --d){

答案 1 :(得分:1)

您可以修改generate以将前导字符作为参数,并打印以该字符开头的所有5个字符的字符串。然后使用每个可能的前导字符调用此修改后的generate