交换ArrayList java的元素

交换ArrayList java的元素,java,Java,我发现这段代码用于交换,但我需要消除递归?是否可以使用ArrayList而不是数组 public class A { static ArrayList<int[]> permutations(int[] a) { ArrayList<int[]> ret = new ArrayList<int[]>(); permutation(a, 0, ret); return ret; } pu

我发现这段代码用于交换,但我需要消除递归?是否可以使用ArrayList而不是数组

public class A {

    static ArrayList<int[]> permutations(int[] a) {
        ArrayList<int[]> ret = new ArrayList<int[]>();
        permutation(a, 0, ret);
        return ret;
    }

    public static void permutation(int[] a, int pos, ArrayList<int[]> list) {
        if (a.length - pos == 1)
            list.add(a.clone());

        else
            for (int i = pos; i < a.length; i++) {
                swap(a, pos, i);
                permutation(a, pos + 1, list);
                swap(a, pos, i);
            }
    }

    public static void swap(int[] arr, int pos1, int pos2) {
        int h = arr[pos1];
        arr[pos1] = arr[pos2];
        arr[pos2] = h;
    }
公共A类{
静态数组列表置换(int[]a){
ArrayList ret=新的ArrayList();
置换(a,0,ret);
返回ret;
}
公共静态无效置换(int[]a,int pos,ArrayList列表){
如果(a.长度-位置==1)
list.add(a.clone());
其他的
对于(int i=pos;i
如果您的问题是,您可以使用
数组列表交换两个元素,那么答案是肯定的:

Collections.swap(arr, pos1, pos2);

下面是一个快速而肮脏的非递归解决方案,用于查找整数数组的所有排列:

public static List<int[]> permutation(int[] a) {
    List<int[]> list = new ArrayList<>();
    int l = a.length;
    int permNumber = 0;
    while(true) {
        BitSet usedIndices = new BitSet();
        int[] newPermutation = new int[l];
        int rest = permNumber;
        for(int i=0; i<l; i++) {
            int curIdx = rest % (l-i);
            rest /= (l-i);
            int freeIdx = -1;
            while(curIdx >= 0) {
                do {
                    freeIdx++;
                } while(usedIndices.get(freeIdx));
                curIdx--;
            }
            usedIndices.set(freeIdx);
            newPermutation[i] = a[freeIdx];
        }
        if(rest > 0)
            break;
        list.add(newPermutation);
        permNumber++;
    }
    return list;
}
公共静态列表置换(int[]a){
列表=新的ArrayList();
int l=a.长度;
int permNumber=0;
while(true){
比特集usedIndices=新比特集();
int[]newPermutation=newint[l];
int rest=permNumber;
对于(int i=0;i=0){
做{
freeIdx++;
}while(usedices.get(freeIdx));
库里克斯--;
}
使用dices.set(freeIdx);
新置换[i]=a[freeIdx];
}
如果(剩余>0)
打破
列表。添加(新排列);
permNumber++;
}
退货清单;
}

这段代码只是根据其序号生成一个排列。请注意,排列的数量会迅速增长(作为数组长度的阶乘),因此即使在不太大的数组上,您也可以从MemoryError中获得

您能具体说明您的问题吗?交换什么?在交换中,我没有看到任何递归。