转载自: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);
}
}