/**
* 产生笛卡尔积组合.
*
* @param crossArgs 信息组合。
* <pre>
* 格式:{
* { 1, 2, 3 },
* { a, b, c, d },
* { A, B, C },
* ...
* }
* </pre>
*
* @return 笛卡尔积组合结果
*/
public
static List<List<String>> cross(List<List<String>> crossArgs) {
int
rows = crossArgs.size() > 0
? 1
: 0;
for
(List<String> data : crossArgs) {
rows *= data.size();
}
int[] record =
new int[crossArgs.size()];
List<List<String>> results =
new ArrayList<List<String>>();
for
(int
i = 0; i < rows; i++) {
List<String> row =
new ArrayList<String>();
for
(int
index = 0; index < record.length; index++) {
row.add(crossArgs.get(index).get(record[index]));
}
results.add(row);
crossRecord(crossArgs, record, crossArgs.size() -
1);
}
return
results;
}
/**
* 产生笛卡尔积当前行索引记录.
*
* @param sourceArgs 要产生笛卡尔积的源数据
* @param record 每行笛卡尔积的索引组合
* @param level 索引组合的当前计算层级
*/
private
static void
crossRecord(List<List<String>> sourceArgs, int[] record,
int level) {
record[level] = record[level] +
1;
if
(record[level] >= sourceArgs.get(level).size() && level >
0) {
record[level] =
0;
crossRecord(sourceArgs, record, level -
1);
}
}
原文地址:http://www.marsclan.org/html/experiment/code/java/20120308C01/