笛卡兒積的java實現
阿新 • • 發佈:2018-04-06
字符串 blank sina elf public 下一個 數量 htm 遍歷集合
參考: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); } } }
這種實現,個人覺得是不是比較通俗易懂,歡迎大家糾正其中未發現的錯誤。。。
笛卡兒積的java實現