3

だから私はリストを持っています:

a 25
b 18
c 18
d 18
e 14
f 14
g 12
... and so on

一致する番号ごとに、識別子のすべての順列を取得する必要があります。私の例から必要なリストは次のとおりです。

abcdefg
abdcefg
acbdefg
acdbefg
adbcefg
adcbefg
abcdfeg
abdcfeg
acbdfeg
acdbfeg
adbcfeg
adcbfeg

問題を解決するために現在行っている手順:

  1. リストを読み込み、各値を配列 ([a][12]) に配置し、それを ArrayList に配置します。
  2. 次に、繰り返し番号があるかどうかを調べて、HashMap 内にメモします。
  3. 次に、HashMap を通過するように for ループを設定します。番号が繰り返されない場合は、リストに追加します。数値が繰り返された場合は、ヒープのアルゴリズムを使用してすべての順列を取得します。

私がそれを処理する場合、次のように番号をリストに追加します。

a
abcd
abdc
adbc
...
abcdef
abcdfe
abdcef
adbcfe
...
abcdefg
abcdfeg

私の現在のコードは意図したとおりに機能せず (リストを 1 つしか生成しません)、古いリストを追加しながら、新しいリストを継続的に生成するコードを書き始める方法さえわかりません。道に迷って申し訳ありません。私は現在データ構造のコースを受講しており、すべてが慣れ親しんだ領域から外れているように感じます (連結リストについての議論を始めたばかりです)。

注 1: allLists は現在のすべてのリスト (a、abcd、adcb) を保持し、permutationList はリストのすべての順列を保持します。

注 2: ブール リストを使用してこれを行っていますが、達成しようとしていることを簡単に視覚的に表現するために文字を使用しました。

問題があると予想されるコード:

public static Boolean[] combine (int i, int j) {
    int aLen = allLists.get(j).length;
    int bLen = permutationList.get(i).length;

    Boolean[] newList = new Boolean[aLen + bLen];
    System.arraycopy(allLists.get(j), 0, newList, 0, aLen);
    System.arraycopy(permutationList.get(i), 0, newList, aLen, bLen);

    return newList;
}

public static void setAllLists() {
    if(allLists.size() == 0) {
        allLists.add(permutationList.get(0));
    }

    for(int i = 0; i < permutationList.size(); i++) {
            for(int j = 0; j < allLists.size(); j++) {
                Boolean[] newList = combine(i,j);
                if(i == 0) {
                    allLists.set(j, newList);
                }
                else {
                    allLists.add(newList);
            }
        }
    }
    permutationList.clear();
}
4

1 に答える 1