Java实现笛卡尔积

  /**
    * 产生笛卡尔积组合.
    *
    * @param crossArgs 信息组合。
    *  <pre>
    *  格式:{
    *          { 1, 2, 3 },
    *          { a, b, c, d },
    *          { A, B, C },
    *          ...
    *    }
    * </pre>
    *
    * @return 笛卡尔积组合结果
    */
   public static List<List<String>> cross(List<List<String>> crossArgs) {
 
     // 计算出笛卡尔积行数
     int rows = crossArgs.size() > 0 ? 1 : 0 ;
 
     for (List<String> data : crossArgs) {
       rows *= data.size();
     }
 
     // 笛卡尔积索引记录
     int [] record = new int [crossArgs.size()];
 
     List<List<String>> results = new ArrayList<List<String>>();
 
     // 产生笛卡尔积
     for ( int i = 0 ; i < rows; i++) {
       List<String> row = new ArrayList<String>();
      
       // 生成笛卡尔积的每组数据
       for ( int index = 0 ; index < record.length; index++) {
         row.add(crossArgs.get(index).get(record[index]));
       }
      
       results.add(row);
       crossRecord(crossArgs, record, crossArgs.size() - 1 );
     }
 
     return results;
   }
 
   /**
    * 产生笛卡尔积当前行索引记录.
    *
    * @param sourceArgs 要产生笛卡尔积的源数据
    * @param record 每行笛卡尔积的索引组合
    * @param level 索引组合的当前计算层级
    */
   private static void crossRecord(List<List<String>> sourceArgs, int [] record, int level) {
     record[level] = record[level] + 1 ;
 
     if (record[level] >= sourceArgs.get(level).size() && level > 0 ) {
       record[level] = 0 ;
       crossRecord(sourceArgs, record, level - 1 );
     }
   }
原文地址:http://www.marsclan.org/html/experiment/code/java/20120308C01/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值