1.概要
これまで組み合わせの全パターンを取得する際には、1文字単位でのアナグラム方式で順列の列挙を行っていた。
例、A.B.C では以下の 3! (= 6) パターン
ABC
ACB
BAC
BCA
CAB
CBA
しかし、上記の方法だと2文字以上の値をひとつの要素として扱いたいときに上手くいかなかった。(※例えば、4.8.10 の場合、10をひとつの要素としたいが、1文字単位で組み換えが起こるため、以下のように4.8.1.0 の 4! パターンで列挙されてしまう)。
4810
4801
4180
4108
4081
4018
8410
8401
8140
8104...
以下略
そこで、文字数に関わらない順列の列挙をどうにかして実現できないかと考えた。
2.Listを利用した要素の列挙
上記参考ではcharの集合であるStringを利用して組み合わせパターンを列挙しており、であれば集合体が配列であってもパターンの列挙は実現可能な筈である。上記参考ではメソッドの中で要素のサイズが変調しているため、可変長配列であるListを利用することを思いついた。
以下、作成したコード
public static void main(String[] args) {
String[] sArray = {"4", "8", "10"};
List<String> sList = new LinkedList<>(Arrays.asList(sArray));
List<String> cList = new LinkedList<>();
permutation(sList, cList);
}
private static void permutation(List<String> sList, List<String> cList) {
for (int i = 0; i < sList.size(); i++) {
if (sList.size() == 1) {
cList.addAll(sList);
System.out.println(cList);
} else {
List<String> base = new LinkedList<>(sList);
List<String> container = new LinkedList<>(cList);
container.add(base.get(i));
base.remove(i);
permutation(base, container);
}
}
}
以下、出力
[4, 8, 10]
[4, 10, 8]
[8, 4, 10]
[8, 10, 4]
[10, 4, 8]
[10, 8, 4]
目的であった文字数に関わらない順列の列挙を実現した。
3.まとめ
取り急ぎコーディングしたため、もっといい形での書き方があるかもしれない。
プログラミング初心者であり、Qiitaも初投稿のため、何かご指摘の点などございましたらご意見いただけると幸甚です。