java 笛卡尔积算法实现

it2022-05-05  161

笛卡尔积很多时候都会用到,以下是java的实现:

import java.util.ArrayList; import java.util.List;

public class Descartes {     public static void run(List<List<String>> dimvalue,List<String> result,int layer,String curstring)     {         //如果不是最后一个子集合时         if(layer<dimvalue.size()-1)         {                 //如果当前子集合元素个数为空,则递归调用,进入到下一个子集合的计算。             if(dimvalue.get(layer).size()==0)             {                 run(dimvalue,result,layer+1,curstring);             }             else             {                 //如果当前子集合元素不为空,则循环当前子集合元素,累加到临时变量 后面。并且继续递归调用,直到达到父集合的最后一个子集合。                 for(int i=0;i<dimvalue.get(layer).size();i++)                 {                     StringBuilder s1=new StringBuilder();                     s1.append(curstring);                     s1.append(dimvalue.get(layer).get(i));                     run(dimvalue,result,layer+1,s1.toString());                 }                          }         }         //递归调用到最后一个子集合时         else         {             //如果当前子集合元素为空,则到此为止,将临时变量加入到结果集中。             if(dimvalue.get(layer).size()==0)             {                 result.add(curstring);             }             //如果当前子集合元素不为空,则循环当前子集合所有元素,累加到临时变量后面 ,然后将临时变量加入到结果集中。             else             {                 for(int i=0;i<dimvalue.get(layer).size();i++)                 {                     result.add(curstring+dimvalue.get(layer).get(i));                 }             }         }     }          public static void main(String[] args)     {         List<List<String>> dimvalue=new ArrayList<List<String>>();         List<String> v1=new ArrayList<String>();         v1.add("1");         v1.add("2");         List<String> v2=new ArrayList<String>();         v2.add("A");         v2.add("B");         List<String> v3=new ArrayList<String>();         v3.add("1");         v3.add("2");         v3.add("3"); 

        dimvalue.add(v1);         dimvalue.add(v2);         dimvalue.add(v3);              List<String> result=new ArrayList<String>();                  Descartes.run(dimvalue,result,0,"");

        int i=0;         for(String s:result)         {             System.out.println(i++ + ":"+s);         }     } }

输出结果为:

备注是我自己写,如有不当,欢迎指正。其中使用到递归调用的方法。参考来源:http://blog.chinaunix.net/uid-21125022-id-4392818.html

 


最新回复(0)