天天看点

Java 关于笛卡尔积算法的简单实现

   最近碰到了一个笛卡尔积的算法要求,比如传递过来的参数是"1,3,6,7==4,5,8,9==3,4==43,45,8,9==35,4",则返回的是一个list,如[1,4,3,43,35][1,4,3,43,4][1,4,3,45,35]……,该list包含是4*4*2*4*2=256个元素,现在的思路是这样的:

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

public class DescartesTest {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        String str ="1,3,6,7==4,5,8,9==3,4==43,45,8,9==35,4";

        List<String> result = descartes(str);

        System.out.println(result);

    }

    @SuppressWarnings("rawtypes")

    public static List<String> descartes(String str) {

        String[] list = str.split("==");

        List<List> strs = new ArrayList<List>();

        for(int i=0;i<list.length;i++){

        strs.add(Arrays.asList(list[i].split(",")));

        }

        System.out.println(strs);

        int total = 1;

        for(int i=0;i<strs.size();i++){

            total*=strs.get(i).size();

        }

        String[] mysesult = new String[total];

        int now = 1;

        //每个元素每次循环打印个数

        int itemLoopNum = 1;

        //每个元素循环的总次数

        int loopPerItem =1;

        for(int i=0;i<strs.size();i++){

            List temp = strs.get(i);

            now = now*temp.size();

            //目标数组的索引值

            int index=0;

            int currentSize = temp.size();

            itemLoopNum = total/now;

            loopPerItem = total/(itemLoopNum*currentSize);

            int myindex = 0;

            for(int j=0;j<temp.size();j++){

                //每个元素循环的总次数

                for(int k=0;k<loopPerItem;k++){

                    if(myindex==temp.size())

                        myindex=0;

                    //每个元素每次循环打印个数

                    for(int m=0;m<itemLoopNum;m++){

                        mysesult[index]=(mysesult[index]==null?"":mysesult[index]+",")+((String)temp.get(myindex));

                        index++;

                    }

                    myindex++;

                }

            }

        }

        return Arrays.asList(mysesult);

    }

}

这个,很悲剧的使用了四层循环

Java 关于笛卡尔积算法的简单实现

,暂时没办法避免,不知各位大牛有什么优化的方案或者不同的思路?