67,512
社区成员
发帖
与我相关
我的任务
分享
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);
}
}