当前位置: 首页 > 知识库问答 >
问题:

排列数组并将每个结果保存到ArrayList

姬翰林
2023-03-14

我需要置换一个数组并将每个排列保存在arrayList中,我使用递归方法,但它只重复保存一个结果。

private static List<int[]> permutations = new ArrayList<int[]>();
int array[] = new int[]{1,2,3,4};

public static void permuteArray(int[] array) {
    permuteArray(array, 0);

}

private static void permuteArray(int[] array, int index) {
    if (index == array.length - 1) {
        permutations.add(array);
    }

    for (int i = index; i < array.length; i++) {

        int aux = array[index];
        array[index] = array[i];
        array[i] = aux;

        permuteArray(array, index + 1);

        aux = array[index];
        array[index] = array[i];
        array[i] = aux;

    }
}

共有2个答案

易成天
2023-03-14

我发现我创建的这个实现非常有用,特别是因为它避免了大量创建像集合这样的对象,它都是基于int[]数组的。

顶部的方法执行所有递归重载,底部的三个generate()方法显示了示例调用。您可以使用int[]数组或字符串调用它,然后将其拆分为char[]。。。计算既适用于整数,也适用于字符,您只需将它们转换回字符,然后再输出。第一个generate()方法只创建一个长度为n的int[],并用0、1、…、。。。,为方便起见,n-1。

要获得置换,只需迭代int[][]的第一个维度,第二个维度保存值。

public class Permutations {

    private int[][] permutations;
    private int resultIndex = 0;

    private void permutate(int[] resultCollector, int resultCollectorIndex, int[] permutableValues) {
        if (permutableValues.length > 0) {
            for (int i = 0; i < permutableValues.length; i++) {
                int[] nextResultCollector = Arrays.copyOf(resultCollector, resultCollector.length);
                nextResultCollector[resultCollectorIndex] = permutableValues[i];
                permutate(nextResultCollector, resultCollectorIndex + 1, reduce(permutableValues, i));
            }
        } else {
            System.arraycopy(resultCollector, 0, permutations[resultIndex], 0, resultCollector.length);
            resultIndex++;
        }
    }

    private int[] reduce(int[] d, int k) {
        int[] r = new int[d.length - 1];
        int ind = 0;
        for (int i = 0; i < d.length; i++) {
            if (i != k) {
                r[ind++] = d[i];
            }
        }
        return r;
    }

    public int[][] generate(int n) {
        int permutationCount = factorial(n);
        permutations = new int[permutationCount][n];
        int[] d = new int[n];
        for (int i = 0; i < n; i++) {
            d[i] = i;
        }
        return generate(d);
    }

    public int[][] generate(String input) {
        int[] d = new int[input.length()];
        for (int i = 0; i < input.length(); i++) {
            d[i] = input.charAt(i);
        }
        return generate(d);
    }

    public int[][] generate(int[] input) {
        int n = input.length;
        int permutationCount = factorial(n);
        permutations = new int[permutationCount][n];
        permutate(new int[n], 0, input);
        return permutations;
    }
}
甄文彬
2023-03-14

您可以按以下方式执行:

public class Permutation {
    public static void main(String[] args) {
        java.util.List<StringBuilder> result=new java.util.ArrayList<StringBuilder>();
        permute(java.util.Arrays.asList(1,2,3,4), 0,result);
        for(StringBuilder sb:result)
            System.out.println(sb.toString());
    }

    static void permute(java.util.List<Integer> arr, int k, java.util.List<StringBuilder> result){
        for(int i = k; i < arr.size(); i++){
            java.util.Collections.swap(arr, i, k);
            permute(arr, k+1,result);
            java.util.Collections.swap(arr, k, i);
        }
        if (k == arr.size() -1){
            result.add(new StringBuilder(java.util.Arrays.toString(arr.toArray())));      
        }
    }
}

输出:

[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 3, 1]
[2, 4, 1, 3]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 2, 3, 1]
[4, 2, 1, 3]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 3, 2]
[4, 1, 2, 3]
 类似资料:
  • 我是Python新手。我在分析脑电图数据。我已经创建了函数,用于计算EEG频带的值(基于此答案),但在跨类别应用该函数并将聚合数据保存到新数据集中时遇到了问题 这是一个简化的数据集,: 下面是函数: 我可以将该函数应用于一次试验,并获得保存在字典中的EEG频带值,。在真实数据集中,每个试验有256个样本;这里一次试验只有2个样本,因此函数只返回带的值。 问题 现在,对于每个,我如何在属于相同条件的

  • 本文向大家介绍php查询mysql数据库并将结果保存到数组的方法,包括了php查询mysql数据库并将结果保存到数组的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php查询mysql数据库并将结果保存到数组的方法。分享给大家供大家参考。具体分析如下: 这里主要用到了mysql_fetch_assoc函数 mysql_fetch_assoc语法如下:  范例代码如下: 希望本文所述对

  • 我有一个Spark数据框,我想按一个键对元素进行分组,并将结果作为一个排序列表 目前我正在使用: 如何使列表中的项目按升序排序?

  • 问题内容: 我知道这应该是简单的,我可能正直盯着问题,但我再次陷入困境,需要代码专家的帮助。 我试图从jdbc的一列中取出一行,并将它们放入数组中。 我这样做如下: creatConnection是已经定义的方法,可以执行其明显的工作。我在创建另一个结果集的同时创建了我的结果集,我将该列的字符串存储到一个数组中。然后打印出来以备不时之需。还要确保它在那里。 问题在于其将整个列存储到contactL

  • 我想将多个结构列合并成一个数组。 我从..尝试了数组(col1,col2),但结果是数据类型不匹配,即使所有结构列都是相同的类型。 查询- < code > select array(struct(f_name _ add,True as is_data_found),struct(l_name_add,True as is_data_found))作为标记from (select array(m

  • 问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I