Java - 迭代自定义字母表

时间:2013-06-05 02:11:57

标签: java loops

搜索网站和本网站后,我无法找到解决问题的确切方法。

我想生成一个以'a'开头的列表,并按以下方式迭代:a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa ... < / p>

我想指定2个变量,一个将迭代的字符串和一个显示结果的最大长度/深度的整数。我希望能够将字符串更改为我喜欢的任何长度。

String alpha = "abcdefghijklmnopqrstuvwxyz0123456789";
int depth = 6;

我希望我能够提供足够的答案。谢谢!

5 个答案:

答案 0 :(得分:2)

这是你需要的。如果你想蛮力。

 public static void combin(String input,StringBuffer output,int depth){
      if (depth == 0) {
            System.out.println(output);
        } else {
            for (int i = 0; i < input.length(); i++) {
                output.append(input.charAt(i));
                combin(input, output,depth - 1);
                output.deleteCharAt(output.length() - 1);
            }
        }    
 }

答案 1 :(得分:0)

想象一下,最大长度强度中的每个角色都是一个“翻转者”,就像模拟计数器的翻转者(在我们使用计算机之前!)。翻转开关的侧面为-1,0,1,2 ......并且还具有以-1开始的特性(最右边的一个为0),当它从MAX开始时,它变为0而不是-1,它还会在它左边的一个滚筒上打勾(如果它也溢出,它也可以勾选它左边的滚筒,依此类推)

现在,我们有一个这样的算法:

1)初始化整数列表:-1,-1,-1 ... 0,depth总计。请将这些作为计数器。

2)增加最右边的计数器。

3)现在是棘手的部分。保留一个整数变量,指示我们当前正在处理哪个计数器,将其称为idx = depth-1。如果我们递增的计数器溢出,则不是跳过此步骤,而是将idx递减1并将新指向的计数器勾选为1.在循环中,检查是否溢出,如果是这样,则循环它围绕并向上移动一个计数器等等,直到我们移动idx所以离开它超过0(如果是这样,返回,我们打印出所有组合并循环)或者不要溢出计数器。

4)将对应于列表索引的字符串打印到alpha(如果为-1,则不添加任何内容)。

答案 2 :(得分:0)

您可以使用递归来轻松解决此问题:

List<String> product(String chars, int length) {
    List<String> res = new ArrayList<String>();
    res.add("");
    if (length > 0) {
        for (c : chars) {
            res.addAll(product(chars, length - 1) + c);
        }
    }
    return res;
}

对于您的给定字符串和长度,此列表将非常大(约20亿条目)。

答案 3 :(得分:0)

你要找的是递归!这是我在计算机科学中最喜欢的主题之一,所以请在这里查看:http://en.wikipedia.org/wiki/Recursion_%28computer_science%29该函数通过调用自身来创建循环。

String recurse(String dataSet, String current, int limit) {
    // iterate through each character to add to the word
    for (int i=0; i<dataSet.length(); i++) {
        // print the current character along with the total behind it
        System.out.println(current + dataSet.charAt(i));
        // stop if you reach the length limit
        if (current.length() < limit) {
            // start again with each set of data
            recurse(current + dataSet.charAt(i));
        }
    }
}

recurse("abc", "", 5);

答案 4 :(得分:0)

显然使用recursion我们能够以相当简短的形式写出来。该函数接受了一些集合(我在这个例子中使用了一个集合),而不是创建多个对象来减少内存开销。

public static void main(String[] args) {
    Set<String> set = new TreeSet<String>();
    GenerateUniques(set, "", "abcdefghijklmn", 6);
    System.out.println(set.size());
}

private static void GenerateUniques(Collection<String> coll, String prefix, String chars, int depth) {
    if (depth-- == 0) return;
    for (int i = 0; i < chars.length(); i++) {
        String str = prefix + chars.charAt(i);
        coll.add(str);
        GenerateUniques(coll, str, chars, depth);
    }
}