<Java>順列を生成する

import java.util.*;

public class Sample {
    public static void main(String[] args) {
        
        var list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        
        var perm = Permutation.generate(list);
        perm.forEach(System.out::println);
    }
}

class Permutation {
    public static <T> List<List<T>> generate(List<T> list) {
        
        var srcList = new ArrayList<List<T>>();
        srcList.add(list);
        var dstList = new ArrayList<List<T>>();
        dstList.add(new ArrayList<T>());
        
        while(srcList.size() > 0) {
            var src = srcList.remove(0);
            var dst = dstList.remove(0);
            
            for(var i = 0; i < src.size(); i++) {
                if(src.size() > 1) {
                    var s = new ArrayList<>(src.subList(0, i));
                    s.addAll(src.subList(i + 1, src.size()));
                    srcList.add(s);
                }
                var d = new ArrayList<>(dst);
                d.add(src.get(i));
                dstList.add(d);
            }
        }
        return dstList;
    }
}
[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 2, 3]
[1, 4, 3, 2]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 1, 3]
[2, 4, 3, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 1, 2, 3]
[4, 1, 3, 2]
[4, 2, 1, 3]
[4, 2, 3, 1]
[4, 3, 1, 2]
[4, 3, 2, 1]