笛卡尔乘积运算结果的输出{n1,n2...}*{m1,m2,m3..}*{p1,p2,p3...}*

  1. import java.util.ArrayList;
  2. import java.util.Stack;
  3. /**
  4.  *
  5.  * 实现笛卡尔乘积运算结果的输出:
  6.  *  {n1,n2...}*{m1,m2,m3..}*{p1,p2,p3...}*....
  7.  *  模型非常类似树的先根遍历算法或图的深度优先搜索算法(有些勉强),如果输入是:
  8.  *     {n1,n2}*{m1,m2,m3}*{p1,p2,p3}
  9.  *  那么搜索模型是:
  10.  *   root-->n1--->m1--->p1
  11.  *                  --->p2
  12.  *                  --->p3
  13.  *            --->m2--->p1
  14.  *                  --->p2
  15.  *                  --->p3
  16.  *            --->m3--->p1
  17.  *                  --->p2
  18.  *                  --->p3
  19.  *   root-->n2--->m1--->p1
  20.  *                  --->p2
  21.  *                  --->p3
  22.  *            --->m2--->p1
  23.  *                  --->p2
  24.  *                  --->p3
  25.  *            --->m3--->p1
  26.  *                  --->p2
  27.  *                  --->p3
  28.  * 从上面可以看到从root出发,访问出来的模型就是一颗树,root表示第一次层次.
  29.  * 每次从树的第二层节点出发到树的叶子节点结束,所访问过的节点记录就是一个笛卡尔乘积运算结果.
  30.  * 
  31.  */
  32. public class DescartesMultiplication {
  33.      
  34.     public static void main(String[] args) {
  35.         
  36.         //initiate all of data:
  37.         ArrayList list1= new ArrayList();
  38.         ArrayList list2= new ArrayList();
  39.         ArrayList list3= new ArrayList();
  40.         ArrayList list4= new ArrayList();
  41.         ArrayList root= new ArrayList();
  42.         
  43. //        list1.add("1");
  44. //        list2.add("2");
  45. //        list2.add("3");
  46. //        list3.add("4");
  47. //        list3.add("5");
  48. //        list3.add("6");
  49. //        list3.add("7");
  50. //        list4.add("8");
  51. //        list4.add("9");
  52.         
  53.         list1.add(1);
  54.         list2.add(2);
  55.         list2.add("1");
  56.         list2.add(3.3);
  57.         list3.add(4.4);
  58.         list3.add(5);
  59.         list3.add(6.5);
  60.         list3.add(7.0);
  61.         list4.add(8.2);
  62.         list4.add(9.1);
  63.         list4.add(new Object());
  64.         
  65.         root.add(list1);
  66.         root.add(list2);
  67.         root.add(list3);
  68.         root.add(list4);
  69.         
  70.         //print all of data:
  71.         for (int i = 0; i < root.size(); i++) {
  72.             ArrayList list=new ArrayList();
  73.             ArrayList item = (ArrayList) root.get(i);
  74.             for (int j = 0; j < item.size(); j++) {
  75.                 Object element =  item.get(j);
  76.                 list.add(element);
  77.             }
  78.             printArrayList(list);
  79.         }
  80.         
  81.         //begin to a depth-first search traverse from the root node.
  82.         System.out.println("-----Below is a result of DescartesMultiplication-----");
  83.         
  84.         /**
  85.          * 当树的总层次数>1时,注意树的总层次数=root.size()-1.
  86.          */
  87.         if(root.size()>0){
  88.             /**
  89.              * 得到第二层次上所有的树节点.
  90.              */
  91.             ArrayList nodeList = (ArrayList) root.get(0);
  92.             
  93.             /**
  94.              * stack主要用来记录,一次从树的第二层节点到树的叶子节点的时候,所访问过的所有节点.
  95.              */
  96.             Stack<String> stack= new Stack();
  97.             
  98.             /**
  99.              * 从树的第二层次开始先序遍历整颗树.
  100.              */
  101.             traverse(root,0,nodeList,stack);
  102.         }
  103.     }
  104.     
  105.     public static void printArrayList(ArrayList list){
  106.        StringBuffer sb=new StringBuffer();
  107.        sb.append("{");
  108.        for (int i = 0; i < list.size(); i++) {
  109.            sb.append(list.get(i).toString()+",");
  110.        }
  111.        sb.deleteCharAt(sb.length()-1);
  112.        sb.append("}");
  113.        System.out.println(sb.toString());
  114.     }
  115.     
  116.     public static void printArrayList(Object[] array){
  117.         StringBuffer sb=new StringBuffer();
  118.         sb.append("{");
  119.         for (int i = 0; i < array.length; i++) {
  120.             sb.append(array[i].toString()+",");
  121.         }
  122.         sb.deleteCharAt(sb.length()-1);
  123.         sb.append("}");
  124.         System.out.println(sb.toString());
  125.      }
  126.     
  127.     /**
  128.      * 这个方法主要用来实现这种for的嵌套模型:
  129.      * for()
  130.      *    for()
  131.      *       for()
  132.      *         for()
  133.      *           ...
  134.      * @param root  表示整颗树
  135.      * @param treeDepthCounter  记录第几层次,0表示第一层次,1表示第二层次,...
  136.      * @param nodeList  记录在该树的层次上所有节点,就比如第二层的所有节点是{n1,n2}
  137.      * @param stack     主要用来记录,一次从树的第二层节点到树的叶子节点的时候,所访问过的所有节点.
  138.      */
  139.     public static void traverse(ArrayList root,int treeDepthCounter,ArrayList nodeList, Stack stack){
  140.         for (int i = 0; i < nodeList.size(); i++) {
  141.             /**
  142.              * 取得一个树节点
  143.              */
  144.             Object element = nodeList.get(i);
  145.             
  146.             /**
  147.              * 访问该层中的一个节点,记录该节点
  148.              */
  149.             stack.push(element);
  150.             
  151.             /**
  152.              * root.size()=整颗树所拥有的层次数-1
  153.              * treeDepthCounter >= root.size()-1 ,表示已经到达树的叶子节点.
  154.              */
  155.             if( treeDepthCounter >= root.size()-1) {
  156.                 /**
  157.                  * 如果这次从树的第二层节点到树的叶子节点的时候结束,
  158.                  * 那么打印此次搜索中访问的所有节点,stack保存该次访问过的所有节点
  159.                  */
  160.                 Object[] one_traverse=new Object[root.size()];
  161.                 
  162.                 /**
  163.                  * 取出和打印当前stack中的所有记录,但是不破坏stack中的所有记录.
  164.                  */
  165.                 stack.copyInto(one_traverse);
  166.                 printArrayList(one_traverse);
  167.             }else {
  168.                 /**
  169.                  * 开始访问下一层次的树,nextDeepCounter为下一层次的层次数.
  170.                  */
  171.                 int nextDeepCounter=treeDepthCounter+1;
  172.                 
  173.                 /**
  174.                  * 得到下一层次上所有的树节点,比如第3层次上的树节点是{m1,m2,m3}.
  175.                  */
  176.                 ArrayList nextNodeList = (ArrayList) root.get(nextDeepCounter);
  177.                 /**
  178.                  * 开始访问下一层次的树节点.
  179.                  */
  180.                 traverse(root,nextDeepCounter,nextNodeList,stack);    
  181.             }
  182.             
  183.             /**
  184.              * 当该节点访问结束时,从记录中删除该节点.
  185.              */
  186.             stack.pop();
  187.         }
  188.     }
  189. }

 

如果输入内容为:
{1}
{2,3}
{4,5,6,7}
{8,9}

输出结果为:
{1,2,4,8}
{1,2,4,9}
{1,2,5,8}
{1,2,5,9}
{1,2,6,8}
{1,2,6,9}
{1,2,7,8}
{1,2,7,9}
{1,3,4,8}
{1,3,4,9}
{1,3,5,8}
{1,3,5,9}
{1,3,6,8}
{1,3,6,9}
{1,3,7,8}
{1,3,7,9}


如果输入内容为:
{1}
{2,1,3.3}
{4.4,5,6.5,7.0}
{8.2,9.1,java.lang.Object@3a803a80}

那么输出结果为:
{1,2,4.4,8.2}
{1,2,4.4,9.1}
{1,2,4.4,java.lang.Object@3a803a80}
{1,2,5,8.2}
{1,2,5,9.1}
{1,2,5,java.lang.Object@3a803a80}
{1,2,6.5,8.2}
{1,2,6.5,9.1}
{1,2,6.5,java.lang.Object@3a803a80}
{1,2,7.0,8.2}
{1,2,7.0,9.1}
{1,2,7.0,java.lang.Object@3a803a80}
{1,1,4.4,8.2}
{1,1,4.4,9.1}
{1,1,4.4,java.lang.Object@3a803a80}
{1,1,5,8.2}
{1,1,5,9.1}
{1,1,5,java.lang.Object@3a803a80}
{1,1,6.5,8.2}
{1,1,6.5,9.1}
{1,1,6.5,java.lang.Object@3a803a80}
{1,1,7.0,8.2}
{1,1,7.0,9.1}
{1,1,7.0,java.lang.Object@3a803a80}
{1,3.3,4.4,8.2}
{1,3.3,4.4,9.1}
{1,3.3,4.4,java.lang.Object@3a803a80}
{1,3.3,5,8.2}
{1,3.3,5,9.1}
{1,3.3,5,java.lang.Object@3a803a80}
{1,3.3,6.5,8.2}
{1,3.3,6.5,9.1}
{1,3.3,6.5,java.lang.Object@3a803a80}
{1,3.3,7.0,8.2}
{1,3.3,7.0,9.1}
{1,3.3,7.0,java.lang.Object@3a803a80}

 

原文引自:http://www.blogjava.net/chinayuan/archive/2008/09/02/226246.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值