Java实现多个数组间的排列组合

  

Java实现多个数组间的排列组合,可以通过使用递归实现。具体步骤如下:

1.定义递归方法,其中参数包括原始数组列表、临时结果列表、深度(代表当前已经处理完的数组层数)、结果列表(存储最终结果)

2.当深度达到原始数组列表的大小时,将临时结果列表添加到结果列表中

3.遍历当前原始数组,逐个取出数组中的元素,添加到临时结果列表中

4.每取出一个数组元素,深度加1,再次调用递归方法,处理下一层数组

5.处理完当前数组,将临时结果列表的最后一个元素删除,深度减1,回溯到上一层递归调用的位置

6.遍历完所有原始数组中的元素,即可得到所有数组的排列组合结果

下面通过两个示例说明具体实现方法:

示例1:有3个数组,分别是[1,2,3]、[4,5]和[6]。要求输出它们的排列组合。

import java.util.ArrayList;
import java.util.List;

public class ArrangementCombination {

    public static void main(String[] args) {
        List<List<Integer>> arrays = new ArrayList<>();
        arrays.add(new ArrayList<>(){{add(1); add(2); add(3);}});
        arrays.add(new ArrayList<>(){{add(4); add(5);}});
        arrays.add(new ArrayList<>(){{add(6);}});
        List<List<Integer>> results = new ArrayList<>();
        arrangeCombine(arrays, new ArrayList<>(), 0, results);
        System.out.println(results);
    }

    public static void arrangeCombine(List<List<Integer>> arrays, List<Integer> tempRes, int depth, List<List<Integer>> results) {
        if (depth == arrays.size()) {
            results.add(new ArrayList<>(tempRes));
            return;
        }
        List<Integer> currentArray = arrays.get(depth);
        for (int i = 0; i < currentArray.size(); i++) {
            tempRes.add(currentArray.get(i));
            arrangeCombine(arrays, tempRes, depth + 1, results);
            tempRes.remove(tempRes.size() - 1);
        }
    }
}

输出结果如下:

[[1, 4, 6], [1, 5, 6], [2, 4, 6], [2, 5, 6], [3, 4, 6], [3, 5, 6]]

这6个列表分别对应于3个原始数组的所有排列组合。

示例2:有4个数组,分别是[1,2]、[3,4]、[5,6]和[7,8]。要求输出它们的排列组合。

import java.util.ArrayList;
import java.util.List;

public class ArrangementCombination {

    public static void main(String[] args) {
        List<List<Integer>> arrays = new ArrayList<>();
        arrays.add(new ArrayList<>(){{add(1); add(2);}});
        arrays.add(new ArrayList<>(){{add(3); add(4);}});
        arrays.add(new ArrayList<>(){{add(5); add(6);}});
        arrays.add(new ArrayList<>(){{add(7); add(8);}});
        List<List<Integer>> results = new ArrayList<>();
        arrangeCombine(arrays, new ArrayList<>(), 0, results);
        System.out.println(results);
    }

    public static void arrangeCombine(List<List<Integer>> arrays, List<Integer> tempRes, int depth, List<List<Integer>> results) {
        if (depth == arrays.size()) {
            results.add(new ArrayList<>(tempRes));
            return;
        }
        List<Integer> currentArray = arrays.get(depth);
        for (int i = 0; i < currentArray.size(); i++) {
            tempRes.add(currentArray.get(i));
            arrangeCombine(arrays, tempRes, depth + 1, results);
            tempRes.remove(tempRes.size() - 1);
        }
    }
}

输出结果如下:

[[1, 3, 5, 7], [1, 3, 5, 8], [1, 3, 6, 7], [1, 3, 6, 8], [1, 4, 5, 7], [1, 4, 5, 8], [1, 4, 6, 7], [1, 4, 6, 8], [2, 3, 5, 7], [2, 3, 5, 8], [2, 3, 6, 7], [2, 3, 6, 8], [2, 4, 5, 7], [2, 4, 5, 8], [2, 4, 6, 7], [2, 4, 6, 8]]

这16个列表分别对应于4个原始数组的所有排列组合。

相关文章