2

指定された char 配列のすべての可能な組み合わせを生成するために、配列を反復処理しようとしています。

指定した長さが 4 の場合、配列内の文字のすべての組み合わせを長さ 4 まで繰り返します。

次のようになります。

char[] charArray = "abcdefghijklmnopqrstuvwxyz".toCharArray();

私が欲しいメソッドの出力:

a, b, c, ..., x, y, z, aa, ab, ac, ..., ax, ay, az, ba, bb, bc, ..., bx, by, bz, ca, cb、cc、... zzzx、zzzy、zzzz

ここにいくつかのコードがあります:

cs = charArray;
cg = new char[4]; // 4 up to 4 characters to guess

int indexOfCharset = 0; // should I be using all these?
int indexOfCurrentGuess = 0;
int positionInString = 0;

public void incrementNew() {
    // 1 DIGIT guesses
    if (cg.length == 0) {
        if (indexOfCharset == cs.length) {
            cg = new char[cg.length + 1];
        } else {
            cg[positionInString] = nextChar();
        }
    }
    // 2 DIGIT guesses
    else if (cg.length == 1) {
        if (cg[0] == cs.length && cg[1] == cs.length) {
            cg = new char[cg.length + 1];
        } else {
            ... Something goes here <-
            cg[positionInString] = nextChar();
        }
    }
    System.out.println("cg[0]=" + cg[0]);
}

public char nextChar() {
    char nextChar;
    if (indexOfCharset < cs.length) {
        nextChar = cs[indexOfCharset];
    } else {
        indexOfCharset = 0;
        nextChar = cs[indexOfCharset];
    }
    indexOfCharset++;
    //System.out.println("nextChar = " + nextChar);
    return nextChar;

}

私が考えることができる唯一の方法は、多くの IF ステートメントを使用することです。それをより適切に行うアルゴリズムまたは方法はありますか? そうでない場合、2 人以上のキャラクターを扱う方法について何か提案はありますか?

編集:

azだけでなく、ソートされていないchar配列でも機能するようにしたい。

私が見つけたすべての実装は、ソートされた配列に対してのみ機能します..

4

1 に答える 1

2

これを試すことができます:

static char[] letters = "abcdefghijklmnopqrstuvwxyz".toCharArray();

static void getChars(char[] lastChars, int pos, int length) {
    for (char c : letters) {
        char[] newChars = lastChars.clone();
        newChars[pos] = c; // if you have "aa" for example and the current length is 4. If c = "a", newChars is now "aaa"
        if (pos + 1 < length) { // as your lenths is 4 and you still have only 3 letters, getChars adds the missing ones
            getChars(newChars, pos + 1, length);
        } else {
            System.out.println(newChars);
        }
    }
}

public static void main(String[] args) {
    int maxLength = 4;

    for (int length = 1; length <= maxLength; length++) {
        for (char c : letters) {
            if (length > 1) {
                char[] chars = new char[length];
                chars[0] = c;
                getChars(chars, 1, length);
            } else {
                System.out.println(c);
            }
        }
    }

}
于 2013-03-07T12:12:09.383 に答える