商品规格常用的规格排列组合算法

转载自:http://blog.csdn.net/tyhj_sf/article/details/53769752

 

public class Test3 {

    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("产地");
        list1.add("尺码");
        list1.add("重量");
        List<String> list2 = new ArrayList<>();
        list2.add("北京");
        list2.add("南京");
        list2.add("东京");
        List<String> list3 = new ArrayList<>();
        list3.add("1kg");
        list3.add("2kg");
        list3.add("3kg");
        List<List<String>> allList = new ArrayList<>();
        allList.add(list1);
        allList.add(list2);
//        allList.add(list3);
        List<List<String>> result = new ArrayList<>();
        long start = System.currentTimeMillis();
//        calculateCombination(allList, 0, new String[allList.size()]);
        calculateCombination(allList,result);
        long end = System.currentTimeMillis();
        System.out.println("共耗时:"+(end -start));
        System.out.println(result);
        System.out.println("共"+result.size()+"个规格");
    }

    /**
     * 方法1:递归
     * @param inputList
     * @param beginIndex
     * @param arr
     */
    public  static void calculateCombination(List<List<String>> inputList, int beginIndex, String[] arr,List<List<String>> result) {
        if(beginIndex == inputList.size()){
            //在这里进行你自己的处理,比如打印组合的结果
            List<String> temp = new ArrayList<>();
            for (String i : arr) {
                temp.add(i);
                System.out.print(i+", ");
            }
            result.add(temp);
            System.out.println();
            return;
        }
        for(String c: inputList.get(beginIndex)){
            arr[beginIndex] = c;
            calculateCombination(inputList, beginIndex + 1, arr,result);
        }
    }

    /**
     * 算法二,非递归计算所有组合
     * @param inputList 所有数组的列表
     * */
    public  static void calculateCombination(List<List<String>> inputList,List<List<String>> result) {
        List<Integer> combination = new ArrayList<Integer>();
        int n=inputList.size();
        for (int i = 0; i < n; i++) {
            combination.add(0);
        }
        int i=0;
        boolean isContinue=false;
        do{
            List<String> temp = new ArrayList<>();
            //打印一次循环生成的组合
            for (int j = 0; j < n; j++) {
                temp.add(inputList.get(j).get(combination.get(j)));
                System.out.print(inputList.get(j).get(combination.get(j))+", ");
            }
            result.add(temp);
            System.out.println();

            i++;
            combination.set(n-1, i);
            for (int j = n-1; j >= 0; j--) {
                if (combination.get(j)>=inputList.get(j).size()) {
                    combination.set(j, 0);
                    i=0;
                    if (j-1>=0) {
                        combination.set(j-1, combination.get(j-1)+1);
                    }
                }
            }
            isContinue=false;
            for (Integer integer : combination) {
                if (integer != 0) {
                    isContinue=true;
                }
            }
        }while (isContinue);
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值