/**
* 产生笛卡尔积组合.
*
* @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/