zoukankan      html  css  js  c++  java
  • 求多个队列、数组的笛卡尔集

    说明

    在开发一个商城产品的时候,遇到一个需要求笛卡尔集的需求,查询相关资料解决问题后,记录下关键算法,以备查询

    Js版本

    示例

    var array =[];
    var a1=["红色","蓝色","绿色"];
    var a2=["方形","圆形","三角形"];
    var a3=["大","中","小"];
    array.push(a1);
    array.push(a2);
    array.push(a3);
    
    //笛卡尔乘积算法
    function descartes(array){
      let count = 1;
      array.forEach(item => count *= item.length);
    
      let lstResult = [];
      for (let i = 0; i < count; ++i) {
        let lstTemp = [];
        let j = 1;
        array.forEach(item =>
        {
    		j *= item.length;
    		lstTemp.push(item[parseInt(i / parseInt(count / j)) % item.length]);
         });
        lstResult.push(lstTemp);
      }
      return lstResult;
    };
    
    var result = descartes(array);
    console.info(result);
    

    运行结果

    Java版本

    示例

    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * description
     *
     * @author: YH
     * @create: 2020-08-21 16:55
     **/
    public class DescartesUtil {
    
        /**
         * 笛卡尔乘积算法
         *
         * @param lstSplit
         * @return
         */
        public static<T> List<List<T>> descartes(List<List<T>> lstSplit) {
            int count = 1;
            for (List<T> item : lstSplit) {
                count *= item.size();
            }
    
            List<List<T>> lstResult = new ArrayList<List<T>>();
    
            for (int i = 0; i < count; ++i) {
                List lstTemp = new ArrayList<T>();
                int j = 1;
                for (List<T> item : lstSplit) {
                    j *= item.size();
                    int index = (i / (count / j)) % item.size();
                    lstTemp.add(item.get(index));
                }
                lstResult.add(lstTemp);
            }
            return lstResult;
        }
    
        public static void main(String[] args) {
            List<List<String>> list = new ArrayList<>();
            List<String> a1=Arrays.asList("红色","蓝色","绿色");
            List<String> a2=Arrays.asList("方形","圆形","三角形");
            List<String> a3=Arrays.asList("大","中","小");
            list.add(a1);
            list.add(a2);
            list.add(a3);
            List<List<String>> result = descartes(list);
            result.forEach(System.out::println);
        }
    }
    
    

    运行结果

  • 相关阅读:
    Decker ce版社区(个人、免费)版安装
    修改SA登录限制
    vue eslint配置
    win10 搭建FMS流媒体服务 nginx rtmp
    直播推流软件
    常用直播拉流地址
    vue 父组件异步给子组件传递参数
    go int、int32、int6、float64、float32、bool、interface{}、string类型转换
    go如何往数据库中插入null
    go项目中日志的打印
  • 原文地址:https://www.cnblogs.com/YangJavaer/p/13541912.html
Copyright © 2011-2022 走看看