Let's write β

プログラミング中にできたことか、思ったこととか

Lispでの順列生成をそのままJavaへ

Javaで総称型を利用して一般的なリストにたいする順列生成をLispから直訳で移植してみました。

import java.util.ArrayList;
public class Perm {
        private static <E> ArrayList<ArrayList<E>> listPerm(ArrayList<E> items) {
                if(items.size() == 0) {
                        ArrayList<ArrayList<E>> resArry = new ArrayList<ArrayList<E>>();
                        resArry.add(new ArrayList<E>());
                        return resArry;
                } else {
                        ArrayList<ArrayList<E>> grandRes = new ArrayList<ArrayList<E>>();

                        for(E item : items) {
                                ArrayList<E> copyArry = (ArrayList<E>)items.clone();
                                copyArry.remove(item);
                                ArrayList<ArrayList<E>> res = listPerm(copyArry);
                                for(ArrayList<E> r : res) {
                                        r.add(0, item);
                                }
                                grandRes.addAll(res);
                        }

                        return grandRes;
                }
        }

        public static ArrayList<ArrayList<Integer>> numPerm(int n) {
                ArrayList<Integer> numArry = new ArrayList<Integer>();
                for(int i = 1; i <= n; i++) {
                        numArry.add(i);
                }
                return listPerm(numArry);
        }

        public static void main(String[] args) {
                System.out.println(Perm.numPerm(4));
        }
}

総称型を利用しているので、任意のArrayListについて順列生成できます。