Java特定的字符串生成器

时间:2013-12-29 16:43:37

标签: java string combinatorics

我正在尝试用Java构建某种字符串生成器,但到目前为止还没有太多运气让它以我需要的方式工作。这也是为什么我想请一位有更多经验的人帮我完成这项任务。

我是java和编程的新手,但是我希望我能够理解那些在这个问题上更先进的人的提示。

我想做什么:

我想使用let说的10个字符,即

char[] volumeArray = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'};

并生成5个字母长的字符串,包括基于volumeArray的几乎所有可能的变化,只有我需要了解的条件是单个字符在生成的5个字符串中最多只能使用两次,即

aaaab - 不可接受

aabbc或abbac - 这样的组合没问题,字母可以在单个字符串中重复最多两次,但变体必须包括所有可能的组合,包括来自volumeArray的所有字母

我想使用此处的代码:How to generate a random alpha-numeric string?但我没有成功根据我的需要修改这些代码。

我在Linux中也使用了crunch,但是没有参数可以让我指定在生成的字符串中只使用两次的单个字符,这样使用26个字母也会产生巨大的文件。

如果符合上述要求的代码并将输出写入文件,你们能帮助我创建一块吗?

我感谢任何帮助,如果这是一个简单的任务,请接受我的道歉。

亲切的问候 马里乌斯

1 个答案:

答案 0 :(得分:0)

解决方案

public static void main(String[] args) {
    Random random = new Random();
    char[] volumeArray = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'};
    int length = volumeArray.length;

    char[] combinations = prepareCombinationsArray(volumeArray, length);
    Set<Integer> uniqueIndexes = selectUniqueIndexes(random, combinations);
    StringBuilder stringBuilder = buildRandomString(combinations, uniqueIndexes);

    System.out.println(stringBuilder.toString());
}

private static char[] prepareCombinationsArray(char[] volumeArray, int length) {
    char[] combinations = new char[length * 2];
    System.arraycopy(volumeArray, 0, combinations, 0, length);
    System.arraycopy(volumeArray, 0, combinations, length, length);
    return combinations;
}

private static Set<Integer> selectUniqueIndexes(Random random, char[] combinations) {
    Set<Integer> uniqueIndexes = new HashSet<Integer>(5);
    do {
        uniqueIndexes.add(random.nextInt(combinations.length));
    } while (uniqueIndexes.size() < 5);
    return uniqueIndexes;
}

private static StringBuilder buildRandomString(char[] combinations, Set<Integer> uniqueIndexes) {
    StringBuilder stringBuilder = new StringBuilder(5);
    for (Integer index : uniqueIndexes) {
        stringBuilder.append(combinations[index]);
    }
    return stringBuilder;
}

结果

dkeak
biida