Java 實作集合 笛卡爾積 組合
import java.util.ArrayList;
import java.util.List;
/**
* @author chen
* @time:2015-1-31 下午05:17:08
*/
public class Descartes {
public static void run(List<List<String>> dimvalue, List<String> result, int layer, String curstring) {
// 大于一個集合時:
if (layer < dimvalue.size() - ) {
// 大于一個集合時,第一個集合為空
if (dimvalue.get(layer).size() == )
run(dimvalue, result, layer + , curstring);
else {
for (int i = ; i < dimvalue.get(layer).size(); i++) {
StringBuilder s1 = new StringBuilder();
s1.append(curstring);
s1.append(dimvalue.get(layer).get(i));
run(dimvalue, result, layer + , s1.toString());
}
}
}
// 隻有一個集合時:
else if (layer == dimvalue.size() - ) {
// 隻有一個集合,且集合中沒有元素
if (dimvalue.get(layer).size() == )
result.add(curstring);
// 隻有一個集合,且集合中有元素時:其笛卡爾積就是這個集合元素本身
else {
for (int i = ; i < dimvalue.get(layer).size(); i++) {
result.add(curstring + dimvalue.get(layer).get(i));
}
}
}
}
/**
*
* @param args
*/
public static void main(String[] args) {
List<List<String>> dimvalue = new ArrayList<List<String>>();
List<String> v1 = new ArrayList<String>();
v1.add("a");
v1.add("b");
List<String> v2 = new ArrayList<String>();
v2.add("c");
v2.add("d");
v2.add("e");
List<String> v3 = new ArrayList<String>();
v3.add("f");
v3.add("g");
dimvalue.add(v1);
dimvalue.add(v2);
dimvalue.add(v3);
List<String> result = new ArrayList<String>();
Descartes.run(dimvalue, result, , "#");
int i = ;
for (String s : result) {
System.out.println(i++ + ":" + s);
}
}
}
歡迎加群交流:JAVA開發交流 246844233