笛卡儿积的java实现

Posted fight-ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笛卡儿积的java实现相关的知识,希望对你有一定的参考价值。

参考: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实现的主要内容,如果未能解决你的问题,请参考以下文章

数据库多表查询优化思路之笛卡儿积

数据库多表查询优化思路之笛卡儿积

SQL中的笛卡儿积问题和多表连接操作

MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积

数据库系列三

数据库-笛卡儿积行选择列选择