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について順列生成できます。