import java.util.ArrayList;
import java.util.List;
public class DescartesUtil {
public static void main(String[] args) {
List<List<String>> list = new ArrayList<List<String>>();
int a = 8, b = 8;
for (int i = 0; i < a; i++) {
List<String> objects = new ArrayList<>(8);
for (int j = 0; j < b; j++) {
objects.add(j+"");
}
list.add(objects);
}
List<List<String>> result = new ArrayList<List<String>>();
long start = System.currentTimeMillis();
descartes(list, result, 0, new ArrayList<String>());
long endTime = System.currentTimeMillis() - start;
System.out.println("time: " + endTime + " ms" + result.size());
}
/**
* Created on 2014年4月27日
* <p>
* Discription:笛卡尔乘积算法
* 把一个List{[1,2],[3,4],[a,b]}转化成List{[1,3,a],[1,3,b],[1,4
* ,a],[1,4,b],[2,3,a],[2,3,b],[2,4,a],[2,4,b]}数组输出
* </p>
*
* @param layer 中间参数
* @param curList 中间参数
*/
private static void descartes(List<List<String>> dimvalue,
List<List<String>> result, int layer, List<String> curList) {
if (layer < dimvalue.size() - 1) {
if (dimvalue.get(layer).size() == 0) {
DescartesUtil.descartes(dimvalue, result, layer + 1, curList);
} else {
for (int i = 0; i < dimvalue.get(layer).size(); i++) {
List<String> list = new ArrayList<String>(curList);
list.add(dimvalue.get(layer).get(i));
DescartesUtil.descartes(dimvalue, result, layer + 1, list);
}
}
} else if (layer == dimvalue.size() - 1) {
if (dimvalue.get(layer).size() == 0) {
result.add(curList);
} else {
for (int i = 0; i < dimvalue.get(layer).size(); i++) {
List<String> list = new ArrayList<String>(curList);
list.add(dimvalue.get(layer).get(i));
result.add(list);
}
}
}
}
}
测试结果:
time: 6284 ms ; size: 16777216
代码还可以优化,用数组会更快