zoukankan      html  css  js  c++  java
  • 集合与集合取笛卡尔积

    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 (layer == dimvalue.size() - 1) {
            //只有一个集合,且集合中没有元素
            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));
                }
            }
        }
    }
    
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        List<List<String>> dimvalue = new ArrayList<>();
        List<String> v1 = new ArrayList<>();
        v1.add("a");
        v1.add("b");
        List<String> v2 = new ArrayList<>();
        v2.add("c");
        v2.add("d");
        v2.add("e");
        List<String> v3 = new ArrayList<>();
        v3.add("f");
        v3.add("g");
    
        dimvalue.add(v1);
        dimvalue.add(v2);
        dimvalue.add(v3);
    
        List<String> result = new ArrayList<>();
    
        BaseReqForm.run(dimvalue, result, 0, "");
    
        int i = 1;
        for (String s : result) {
            System.out.println(i++ + ":" + s);
        }
    }

    摘自:http://blog.chinaunix.net/uid-21125022-id-4392818.html

    以下两种是实际场景因需求改造练手略加改变,正好加深我的印象

    1、组合后返回原格式

    private static void tst(List<List<String>> dimvalue, List<List<String>> result, int layer, List<String> curstring) {
            //大于一个集合时:
            if (layer < dimvalue.size() - 1) {
                //大于一个集合时,第一个集合为空
                if (dimvalue.get(layer).size() == 0)
                    tst(dimvalue, result, layer + 1, curstring);
                else {
                    for (int i = 0; i < dimvalue.get(layer).size(); i++) {
                        List<String> s1 = new ArrayList<>();
                        if (CollectionUtils.isNotEmpty(curstring))
                        s1.addAll(curstring);
                        s1.add(dimvalue.get(layer).get(i));
                        tst(dimvalue, result, layer + 1, s1);
                    }
                }
            }
            //只有一个集合时:
            else if (layer == dimvalue.size() - 1) {
                //只有一个集合,且集合中没有元素
                if (dimvalue.get(layer).size() == 0)
                    result.add(curstring);
                else {//只有一个集合,且集合中有元素时:其笛卡尔积就是这个集合元素本身
                    for (int i = 0; i < dimvalue.get(layer).size(); i++) {
                        List<String> list = new ArrayList<>(curstring);
                        list.add(dimvalue.get(layer).get(i));
                        result.add(list);
                    }
                }
            }
        }

    2、逗号隔开方式

    private void cartesianItemCode(List<List<String>> dimvalue, List<String> result, int layer, String curstring) {
            //大于一个集合时:
            if (layer < dimvalue.size() - 1) {
                //大于一个集合时,第一个集合为空
                if (dimvalue.get(layer).size() == 0)
                    cartesianItemCode(dimvalue, result, layer + 1, curstring);
                else {
                    for (int i = 0; i < dimvalue.get(layer).size(); i++) {
                        StringBuilder s1 = new StringBuilder();
                        s1.append(curstring);
                        if (StringUtils.isNotBlank(curstring)) s1.append(",");
                        s1.append(dimvalue.get(layer).get(i));
                        cartesianItemCode(dimvalue, result, layer + 1, s1.toString());
                    }
                }
            }
            //只有一个集合时:
            else if (layer == dimvalue.size() - 1) {
                //只有一个集合,且集合中没有元素
                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));
                    }
                }
            }
        }
  • 相关阅读:
    有一个实体类,只想返还一部分字段给前端
    Dozer-对象属性映射工具类
    java冒泡排序
    总结Java中的reference类型与四种引用类型
    关于jar包的两种导包方式
    Java Web项目的创建——IDEA+Maven+Tomcat
    关于maven的配置过程
    MYSQL数据库的增删改以及查
    关于linux系统下,出现ERROR 1366 (HY000): Incorrect string value: 'xE6xB4xBBxE5x8AxA8...' for column 'deptN的问题解决方法
    Java Script
  • 原文地址:https://www.cnblogs.com/liuye007/p/10667660.html
Copyright © 2011-2022 走看看