Javaでの配列の順列生成


  1. 再帰を使用した順列生成
import java.util.ArrayList;
import java.util.List;
public class Permutations {
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        List<List<Integer>> permutations = generatePermutations(array);
        System.out.println(permutations);
    }
    public static List<List<Integer>> generatePermutations(int[] array) {
        List<List<Integer>> result = new ArrayList<>();
        generatePermutationsHelper(array, new ArrayList<>(), result);
        return result;
    }
    private static void generatePermutationsHelper(int[] array, List<Integer> currentPermutation, List<List<Integer>> result) {
        if (currentPermutation.size() == array.length) {
            result.add(new ArrayList<>(currentPermutation));
        } else {
            for (int i = 0; i < array.length; i++) {
                if (currentPermutation.contains(array[i])) {
                    continue;
                }
                currentPermutation.add(array[i]);
                generatePermutationsHelper(array, currentPermutation, result);
                currentPermutation.remove(currentPermutation.size() - 1);
            }
        }
    }
}

上記のコードでは、再帰を使用して順列を生成しています。配列の要素を1つずつ選択し、選択した要素を一時的なリストに格納します。すべての要素を選択したら、一時的なリストを結果のリストに追加します。再帰的にこのプロセスを繰り返し、すべての可能な順列を生成します。

  1. ライブラリを使用した順列生成

JavaにはApache Commons Mathなど、順列生成のための便利なライブラリが存在します。以下はApache Commons Mathを使用した例です。

import org.apache.commons.math3.util.CombinatoricsUtils;
public class Permutations {
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        int[] indices = CombinatoricsUtils.factoradic(2, array.length);
        int[] permutation = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            permutation[i] = array[indices[i]];
        }
        System.out.println(Arrays.toString(permutation));
    }
}

上記のコードでは、CombinatoricsUtils.factoradic()メソッドを使用して、指定したインデックスの順列を生成しています。

これらの方法を使用すれば、Javaで配列の順列を生成することができます。順列生成には再帰を使用する方法とライブラリを使用する方法の2つがあります。どちらの方法を選択しても、目的に応じて適切な方法を選ぶことができます。