多个对象list,不用for循环求笛卡尔集

业务需求:现在有好多个维度List   机构:List deptList、渠道:List channelList、

                 产品:List  productList、口径:List  specList等维度。

                 Dimension 对象有code,name,type属性。

               

                 现在需要求所有维度的笛卡尔集的对象。

                 一般我们会想到嵌套for循环,但是for循环会有某一个集合为null的问题

 

现在我们写一个工具方法:

  private static List> getDescartes(List>){

   List> returnList = new Arraylist<>();

   descartesRecursive(list,0,retrunList,new Arraylist());

  }    

 

/**

*递归实现

*原理:从原始list的0开始遍历到最后

*originalList 原始list

*position 当前递归在原始list的位置

*returnList 返回结果

* cacheList 临时保存的list

*/     

private static void descartesRecursive(List> originalList ,int position,List> returnList ,List cacheList ){

  List originalTtemList = originalList .get(position);

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

    //最后一个复用cacheList,节省内存

  List  childCacheList = (i == originalTtemList .size() -1)?cacheList :new Arraylist<>(cacheList );

  childCacheList .add(originalTtemList .get(i));

  if(position ==originalList .size()-1){ //遍历到最后退出递归

   returnList .add(childCacheList );

  continue;

  }

 descartesRecursive(originalList ,position+1,returnList ,childCacheList );

  }

}

   

 

你可能感兴趣的:(java)