public static<T> List<List<T>> descartes(List<List<T>> lstSplit) {
int count = 1;
for (List<T> item : lstSplit) {
count *= item.size();
}
List<List<T>> lstResult = new ArrayList<List<T>>();
for (int i = 0; i < count; ++i) {
List lstTemp = new ArrayList<T>();
int j = 1;
for (List<T> item : lstSplit) {
j *= item.size();
int index = (i / (count / j)) % item.size();
lstTemp.add(item.get(index));
}
lstResult.add(lstTemp);
}
return lstResult;
}