參考:http://blog.sina.com.cn/s/blog_1667198560102wwob.html
在網上查了很多笛卡兒積的乘積,感覺程序都寫得比較復雜,當看到上面的文章的時候,感覺豁然開朗,通俗易懂,所以,在筆者的代碼下,將代碼整理了一下。
首先,需要理解的是,笛卡爾積:多個集合的乘積。
我們可以想到如果,是兩個集合的乘積,如何做運算呢?就是將前一個集合復制(后一個集合的元素數量)份,得到一個新的集合,然后遍歷集合,與后一個集合做連接。
知道了兩個集合的相乘,我們來看看3個集合相稱,我們可以先算前兩個集合的乘積,算出來的新的集合,再與下一個集合相稱,這樣,我們每次做運算本質都是兩個集合的乘積。話不多說,直接看代碼:
import java.util.ArrayList;
/**
* @author
* @create 2018-04-04 19:21
**/
public class Test {
/**
* 計算 多個集合的笛卡爾積
* @param dimValues 存儲多個集合的 二維list
* @return
*/
private static ArrayList<String> descartes(ArrayList<ArrayList<String>> dimValues) {
ArrayList<String> result = new ArrayList<String>();
for (int i = 0 ; i < dimValues.size() ; i++){
ArrayList<String> curList = dimValues.get(i);
if(0 == i){//如果是首個集合,直接放輸入到結果集中
for (String tempStr : curList){
result.add(tempStr);
}
continue;
}
selfCopy(result,curList);//將前一個集合的乘積 result,自我復制 curListCount 份,並將當前集合的元素追加到上邊
}
return result;
}
/**
* 根據當前的集合,將之前的結果集復制
* @param result 之前的集合相稱的結果集
* @param curList 當前集合
*/
private static void selfCopy(ArrayList<String> result,ArrayList<String> curList) {
ArrayList<String> tempList = new ArrayList<String>();
for (String strOfCurList : curList){
for (String strOfResult : result){
tempList.add( strOfResult + strOfCurList );//因為這里是字符串集合相稱,那么其實就是字符串相加。
}
}
result.clear();
for (String tempStr : tempList){
result.add(tempStr);
}
}
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("a1");
a.add("a2");
ArrayList<String> b = new ArrayList<String>();
b.add("b1");
b.add("b2");
ArrayList<String> c = new ArrayList<String>();
c.add("c1");
c.add("c2");
c.add("c3");
ArrayList<String> d = new ArrayList<String>();
d.add("d1");
d.add("d2");
d.add("d3");
ArrayList<ArrayList<String>> dimValue = new ArrayList<ArrayList<String>>();
dimValue.add(a);
dimValue.add(b);
dimValue.add(c);
dimValue.add(d);
ArrayList<String> result = descartes(dimValue);
for (String temp : result){
System.out.println(temp);
}
}
}
這種實現,個人覺得是不是比較通俗易懂,歡迎大家糾正其中未發現的錯誤。。。
