多维数组使用递归方法获取全排列组合

1.获取源数据:

 List<Integer[]> selectAllGroupList = newArrayList<>();//需要递归获取排列组合的数组集合

   for (int i = 0; i < tempSelectList.size(); i++) {

                List<Integer>selectSameGroupList = getSameGroupList(tempList.get(i));//获得一个集合的方法

                int size = selectSameGroupList.size();//数组的长度

                Integer[] arr =selectSameGroupList.toArray(new Integer[size]);//将集合转换为数组

                selectAllGroupList.add(arr);//将数组添加进集合

}

doExchange(selectAllGroupList);//递归方法

2.初始化一个全局的集合用于存放全排列数组:

List arrayLists = new ArrayList<>();

3.doExchange()方法的实现:

public voiddoExchange(List arrayLists) {//对数据进行排列

 

        int len = arrayLists.size();

        //判断数组size是否小于2,如果小于说明已经递归完成了,否则你们懂得的,不懂?断续看代码

        if (len < 2) {

            this.arrayLists = arrayLists;

            return;

        }

        //拿到第一个数组

        int len0;

        if (arrayLists.get(0) instanceof Integer[]) {//根据你自己的数据类型替换为不同的数据类型即可

            Integer[] arr0 = (Integer[])arrayLists.get(0);

            len0 = arr0.length;

        } else {

            len0 = ((ArrayList<Integer>)arrayLists.get(0)).size();

        }

 

        //拿到第二个数组

        Integer[] arr1 = (Integer[])arrayLists.get(1);

        int len1 = arr1.length;

 

        //计算当前两个数组一共能够组成多少个组合

        int lenBoth = len0 * len1;

 

        //定义临时存放排列数据的集合

       ArrayList<ArrayList<Integer>> tempArrayLists = newArrayList<>(lenBoth);

 

        //第一层for就是循环arrayLists第一个元素的

        for (int i = 0; i < len0; i++) {

            //第二层for就是循环arrayLists第二个元素的

            for (int j = 0; j < len1; j++) {

                //判断第一个元素如果是数组说明,循环才刚开始

                if (arrayLists.get(0)instanceof Integer[]) {

                    Integer[] arr0 = (Integer[])arrayLists.get(0);

                    ArrayList<Integer>arr = new ArrayList<>();

                    arr.add(arr0[i]);

                    arr.add(arr1[j]);

                    //把排列数据加到临时的集合中

                    tempArrayLists.add(arr);

                } else {

                    //到这里就明循环了最少一轮啦,我们把上一轮的结果拿出来继续跟arrayLists的下一个元素排列

                   ArrayList<ArrayList<Integer>> arrtemp =(ArrayList<ArrayList<Integer>>) arrayLists.get(0);

                    ArrayList<Integer> arr = newArrayList<>();

                    for (int k = 0; k <arrtemp.get(i).size(); k++) {

                       arr.add(arrtemp.get(i).get(k));

                    }

                    arr.add(arr1[j]);

                    tempArrayLists.add(arr);

                }

            }

        }

 

        //这是根据上面排列的结果重新生成的一个集合

        List newArrayLists = newArrayList<>();

        //把还没排列的数组装进来,看清楚i=2的喔,因为前面两个数组已经完事了,不需要再加进来了

        for (int i = 2; i <arrayLists.size(); i++) {

            newArrayLists.add(arrayLists.get(i));

        }

        //记得把我们辛苦排列的数据加到新集合的第一位喔,不然白忙了

        newArrayLists.add(0, tempArrayLists);

 

        //你没看错,我们这整个算法用到的就是递归的思想。

        doExchange(newArrayLists);

    }

4.处理获得的全排列组合数据arrayLists:

 if (arrayLists.get(0) instanceof Integer[]) {//因为如果传入的数据每一个数组中只有一个值,则会返回一个数组

  itemgroupList.clear();

  Integer[] arr0 = (Integer[])arrayLists.get(0);

  for (int j = 0; j < arr0.length; j++) {

   int itemId = arr0[j];

   itemgroupList.add(itemId);

    LogUtil.e("itemId", itemId +"");

    }else{//因为如果传入的数据每一个数组中只有一个值,则会返回一个数组集合

ArrayList<ArrayList<Integer>>AllgroupList = new ArrayList<>();

AllgroupList.clear();

ArrayList<ArrayList<Integer>>groupList=(ArrayList<ArrayList<Integer>>)arrayLists.get(0);

AllgroupList.addAll(groupList);

}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值