所有可能组合的java列表生成器

时间:2016-09-09 10:25:01

标签: java

我想创建一个函数,列出java中长度为n和n + m的charset的所有可能组合。 我试图演示散列破解是如何工作的,我被要求用java编写,但我对它并不熟悉。 我还想知道是否有像java中的python yeald函数那样的东西,如果有的话我怎么能搞定它。

1 个答案:

答案 0 :(得分:0)

如果此示例可以帮助您,请尝试。它需要3个变量:charset,max和min length并列出所有组合。

import java.util.Arrays;

public abstract class Main {
    int max = 4;
    int min = 2;

    public static void main(String args[]) {
        new Main() {
            public void element(char[] result, int offset, int length) {
                System.out.println(new String(result, offset, length));
            }
        }.generate("ABCD");
    }

    private void generate(char[] input) {
        char[] result = new char[input.length];
        int[] index = new int[input.length];

        // initialize the arrays.
        Arrays.fill(result, 0, result.length, input[0]);
        Arrays.fill(index, 0, index.length, 0);

        // loop over the output lengths.

        for (int length = min; length <= max; length++) {
            int updateIndex = 0;
            do {
                element(result, 0, length);

                // update values that need to reset.
                for (updateIndex = length - 1;
                     updateIndex != -1 && ++index[updateIndex] == input.length;
                     result[updateIndex] = input[0], index[updateIndex] = 0, updateIndex--)
                    ;

                // update the character that is not resetting, if valid
                if (updateIndex != -1) result[updateIndex] = input[index[updateIndex]];
            }
            while (updateIndex != -1);
        }
    }

    void generate(String input) {
        generate(input.toCharArray());
    }

    public abstract void element(char[] result, int offset, int length);
}

测试

AA
AB
AC
AD
BA
BB
BC
BD
CA
CB
CC
CD
DA
DB
DC
DD
AAA
AAB
AAC
AAD
ABA
ABB
ABC
ABD
ACA
ACB
ACC
ACD
ADA
ADB
ADC
ADD
BAA
BAB
BAC
BAD
BBA
BBB
BBC
BBD
BCA
BCB
BCC
BCD
BDA
BDB
BDC
BDD
CAA
CAB
CAC
CAD
CBA
CBB
CBC
CBD
CCA
CCB
CCC
CCD
CDA
CDB
CDC
CDD
DAA
DAB
DAC
DAD
DBA
DBB
DBC
DBD
DCA
DCB
DCC
DCD
DDA
DDB
DDC
DDD
AAAA
AAAB
AAAC
AAAD
AABA
AABB
AABC
AABD
AACA
AACB
AACC
AACD...

你可以尝试online