1. 程式人生 > >笛卡兒積的java實現

笛卡兒積的java實現

字符串 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實現