解决方案 »

  1.   


        public static void main(String[] args) {
            // {15,M},{15,L},{15,XL},{16,黑色},{16,红色},{16,蓝色},{17,棉},{17,麻}
            // 整合成如下数据应该不难,不赘述
            Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
            List<String> list15 = new ArrayList<String>();
            list15.add("M");
            list15.add("L");
            list15.add("XL");
            List<String> list16 = new ArrayList<String>();
            list16.add("黑色");
            list16.add("红色");
            list16.add("蓝色");
            List<String> list17 = new ArrayList<String>();
            list17.add("棉");
            list17.add("麻");
            map.put(15, list15);
            map.put(16, list16);
            map.put(17, list17);        // 单独一个List记录map的有序的key值列表// 关键是有序
            List<Integer> keys = new ArrayList<Integer>();
            keys.add(15);
            keys.add(16);
            keys.add(17);        // 递归调用
            combination(keys, map);
        }    /**
         * keys已经排好序,map为需要显示的内容。初始的keys一定会在map中找到对应值,这里不做过多合法性校验
         */
        private static void combination(List<Integer> keys, Map<Integer, List<String>> map) {
            // 合法性校验
            if (null == keys || keys.isEmpty()) {
                return;
            }        // 第一个为起始
            List<String> starts = map.get(keys.get(0));        // 遍历并开始拼接显示内容
            for (String start : starts) {
                coreCombinate(start, keys.subList(1, keys.size()), map);
            }
        }    /**
         * 核心递归的方法
         */
        private static void coreCombinate(String start, List<Integer> subList, Map<Integer, List<String>> map) {
            // 递归的收敛处
            if (null == subList || subList.isEmpty()) {
                // 如果需要返回,可以透传一个List<String>用来存储
                System.out.println(start);
                return;
            }        // 第一个为起始
            List<String> starts = map.get(subList.get(0));        // 遍历并开始拼接显示内容// 这里与上一层方法略有不同
            for (String startInner : starts) {
                String startNew = start + startInner;
                coreCombinate(startNew, subList.subList(1, subList.size()), map);
            }
        }