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));
                    }
                }
            }
        }
  • 相关阅读:
    工厂方法模式(2)
    单例模式(1)
    数组中任意位置添加数组
    六中设计模式中的原则总结
    开闭原则(设计模式6)
    迪米特法则(设计模式5)
    接口隔离原则(设计模式4)
    依赖倒置原则(设计模式3)
    里氏替换原则(设计模式原则2)
    相似图片搜索的原理(二) (转载)
  • 原文地址:https://www.cnblogs.com/liuye007/p/10667660.html
Copyright © 2011-2022 走看看