public static void run(List<List<String>> dimvalue, List<String> result, int layer, String curstring) { //大于一个集合时: if (layer < dimvalue.size() - 1) { //大于一个集合时,第一个集合为空 if (dimvalue.get(layer).size() == 0) run(dimvalue, result, layer + 1, curstring); else { for (int i = 0; i < dimvalue.get(layer).size(); i++) { StringBuilder s1 = new StringBuilder(); s1.append(curstring); s1.append(dimvalue.get(layer).get(i)); run(dimvalue, result, layer + 1, s1.toString()); } } } //只有一个集合时: else if (layer == dimvalue.size() - 1) { //只有一个集合,且集合中没有元素 if (dimvalue.get(layer).size() == 0) result.add(curstring); //只有一个集合,且集合中有元素时:其笛卡尔积就是这个集合元素本身 else { for (int i = 0; i < dimvalue.get(layer).size(); i++) { result.add(curstring + dimvalue.get(layer).get(i)); } } } } /** * @param args */ public static void main(String[] args) { List<List<String>> dimvalue = new ArrayList<>(); List<String> v1 = new ArrayList<>(); v1.add("a"); v1.add("b"); List<String> v2 = new ArrayList<>(); v2.add("c"); v2.add("d"); v2.add("e"); List<String> v3 = new ArrayList<>(); v3.add("f"); v3.add("g"); dimvalue.add(v1); dimvalue.add(v2); dimvalue.add(v3); List<String> result = new ArrayList<>(); BaseReqForm.run(dimvalue, result, 0, ""); int i = 1; for (String s : result) { System.out.println(i++ + ":" + s); } }
摘自:http://blog.chinaunix.net/uid-21125022-id-4392818.html
以下两种是实际场景因需求改造练手略加改变,正好加深我的印象
1、组合后返回原格式
private static void tst(List<List<String>> dimvalue, List<List<String>> result, int layer, List<String> curstring) { //大于一个集合时: if (layer < dimvalue.size() - 1) { //大于一个集合时,第一个集合为空 if (dimvalue.get(layer).size() == 0) tst(dimvalue, result, layer + 1, curstring); else { for (int i = 0; i < dimvalue.get(layer).size(); i++) { List<String> s1 = new ArrayList<>(); if (CollectionUtils.isNotEmpty(curstring)) s1.addAll(curstring); s1.add(dimvalue.get(layer).get(i)); tst(dimvalue, result, layer + 1, s1); } } } //只有一个集合时: else if (layer == dimvalue.size() - 1) { //只有一个集合,且集合中没有元素 if (dimvalue.get(layer).size() == 0) result.add(curstring); else {//只有一个集合,且集合中有元素时:其笛卡尔积就是这个集合元素本身 for (int i = 0; i < dimvalue.get(layer).size(); i++) { List<String> list = new ArrayList<>(curstring); list.add(dimvalue.get(layer).get(i)); result.add(list); } } } }
2、逗号隔开方式
private void cartesianItemCode(List<List<String>> dimvalue, List<String> result, int layer, String curstring) { //大于一个集合时: if (layer < dimvalue.size() - 1) { //大于一个集合时,第一个集合为空 if (dimvalue.get(layer).size() == 0) cartesianItemCode(dimvalue, result, layer + 1, curstring); else { for (int i = 0; i < dimvalue.get(layer).size(); i++) { StringBuilder s1 = new StringBuilder(); s1.append(curstring); if (StringUtils.isNotBlank(curstring)) s1.append(","); s1.append(dimvalue.get(layer).get(i)); cartesianItemCode(dimvalue, result, layer + 1, s1.toString()); } } } //只有一个集合时: else if (layer == dimvalue.size() - 1) { //只有一个集合,且集合中没有元素 if (dimvalue.get(layer).size() == 0) result.add(curstring); //只有一个集合,且集合中有元素时:其笛卡尔积就是这个集合元素本身 else { for (int i = 0; i < dimvalue.get(layer).size(); i++) { result.add(curstring + "," + dimvalue.get(layer).get(i)); } } } }