参考: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); } } }
这种实现,个人觉得是不是比较通俗易懂,欢迎大家纠正其中未发现的错误。。。