• Java种多个List<String>进行组合可以生成多少种数据,具体组合方法实现


    因为要使用SQL做一个立方体表,从各个不同的维度对数据进行统计。这样可以有利于BI展示。但是针对多个条件需要如何组合查询处对应的结果给前端;想了一下这需要使用到组合。

    内容目录

    例如:针对一张表;表结构如下:

    CREATE TABLE CZT_TEST (
      `biz_key` varchar(100) COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键编号',
      `year` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '年份',
      `adm_div_id` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区划ID',
      `adm_div_code` varchar(200) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '区划编码',
      `adm_div_name` varchar(200) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '区划名称',
      `agency_id` varchar(200) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '单位ID',
      `agency_code` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '单位编码',
      `agency_name` varchar(200) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '单位名称'
    ) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试';
    

    如何使用维度呢?

    使用 year 和 admin_div_id 和 agency_id 这三个字段作为维度,可以看成三个维度,这三个维度可以单独计算统计也可以组合计算统计,那算在一起会出多少中结果;使用Java方法进行排列组合
    Java代码如下:

    package com.example.demo.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Test {
    
    	public static void main(String[] args) {
    		// 年份
    		List<String> list001 = new ArrayList<>();
    		list001.add("2021,");
    		list001.add("2020,");
    
    		// 区划
    		List<String> list002 = new ArrayList<>();
    		list002.add("460100000,"); // 海口市
    		list002.add("460200000,"); // 三亚市
    		list002.add("460300000,"); // 三沙市
    
    		// 单位ID
    		List<String> list003 = new ArrayList<>();
    		list003.add("Agency_001,"); // 单位1
    		list003.add("Agency_002,"); // 单位2
    		list003.add("Agency_003,"); // 单位3
    		list003.add("Agency_004,"); // 单位4
    		list003.add("Agency_005,"); // 单位5
    		list003.add("Agency_006,"); // 单位6
    
    		// A.如果是完全组合的话方法如下
    		List<String> resultList = list001.stream().flatMap(str -> list002.stream().map(str::concat))
    				.flatMap(str -> list003.stream().map(str::concat)).collect(Collectors.toList());
    		// A.1具体多少种组合
    		System.out.println("============>>(list001,list002,list003)组合共:" + resultList.size() +" 种");
    		// A.2组合中都有啥
    		resultList.forEach(x -> {
    			System.out.println(x);
    		});
    		
    		/**
    		 * 不完全组合list001,list002,list003,(list001,list002),(list001,list003)
    		 * ,(list002,list003),(list001,list002,list003)
    		 * B.单个列表组合不用计算直接明显list001,list002,list003
    		 * B.1两两组合计算(list001,list002),(list001,list003),(list002,list003)
    		 */
    		
    		// (list001,list002)组合
    		List<String> resultList12 = list001.stream().flatMap(str -> list002.stream().map(str::concat))
    				.collect(Collectors.toList());
    		// 具体多少种组合
    		System.out.println("============>>(list001,list002)组合共:" + resultList12.size() +" 种");
    		// 组合中都有啥
    		resultList12.forEach(x -> {
    			System.out.println(x);
    		});
    
    		// (list001,list003)组合
    		List<String> resultList13 = list001.stream().flatMap(str -> list003.stream().map(str::concat))
    				.collect(Collectors.toList());
    		// 具体多少种组合
    		System.out.println("============>>(list001,list003)组合共:" + resultList13.size() +" 种");
    		// 组合中都有啥
    		resultList13.forEach(x -> {
    			System.out.println(x);
    		});
    
    		// (list002,list003)组合
    		List<String> resultList23 = list002.stream().flatMap(str -> list003.stream().map(str::concat))
    				.collect(Collectors.toList());
    		// 具体多少种组合
    		System.out.println("============>>(list002,list003)组合共:" + resultList23.size() +" 种");
    		// 组合中都有啥
    		resultList23.forEach(x -> {
    			System.out.println(x);
    		});
    	}
    
    }
    
    

    执行结果如下

    ============>>(list001,list002,list003)组合共:36 种
    2021,460100000,Agency_001,
    2021,460100000,Agency_002,
    2021,460100000,Agency_003,
    2021,460100000,Agency_004,
    2021,460100000,Agency_005,
    2021,460100000,Agency_006,
    2021,460200000,Agency_001,
    2021,460200000,Agency_002,
    2021,460200000,Agency_003,
    2021,460200000,Agency_004,
    2021,460200000,Agency_005,
    2021,460200000,Agency_006,
    2021,460300000,Agency_001,
    2021,460300000,Agency_002,
    2021,460300000,Agency_003,
    2021,460300000,Agency_004,
    2021,460300000,Agency_005,
    2021,460300000,Agency_006,
    2020,460100000,Agency_001,
    2020,460100000,Agency_002,
    2020,460100000,Agency_003,
    2020,460100000,Agency_004,
    2020,460100000,Agency_005,
    2020,460100000,Agency_006,
    2020,460200000,Agency_001,
    2020,460200000,Agency_002,
    2020,460200000,Agency_003,
    2020,460200000,Agency_004,
    2020,460200000,Agency_005,
    2020,460200000,Agency_006,
    2020,460300000,Agency_001,
    2020,460300000,Agency_002,
    2020,460300000,Agency_003,
    2020,460300000,Agency_004,
    2020,460300000,Agency_005,
    2020,460300000,Agency_006,
    ============>>(list001,list002)组合共:6 种
    2021,460100000,
    2021,460200000,
    2021,460300000,
    2020,460100000,
    2020,460200000,
    2020,460300000,
    ============>>(list001,list003)组合共:12 种
    2021,Agency_001,
    2021,Agency_002,
    2021,Agency_003,
    2021,Agency_004,
    2021,Agency_005,
    2021,Agency_006,
    2020,Agency_001,
    2020,Agency_002,
    2020,Agency_003,
    2020,Agency_004,
    2020,Agency_005,
    2020,Agency_006,
    ============>>(list002,list003)组合共:18 种
    460100000,Agency_001,
    460100000,Agency_002,
    460100000,Agency_003,
    460100000,Agency_004,
    460100000,Agency_005,
    460100000,Agency_006,
    460200000,Agency_001,
    460200000,Agency_002,
    460200000,Agency_003,
    460200000,Agency_004,
    460200000,Agency_005,
    460200000,Agency_006,
    460300000,Agency_001,
    460300000,Agency_002,
    460300000,Agency_003,
    460300000,Agency_004,
    460300000,Agency_005,
    460300000,Agency_006,
    

    如何使用呢

    自动保存

    把这些List通过','切割开来,然后使用SQL,根据不同的条件进行查询
    比如:

    select * from year='2021' and adm_div_id='460100000' and agency_id='Agency_002'
    

    这只是组合条件查询出来的一种结果。
    其他维度也可以,比如2个条件
    select * from year='2021' and adm_div_id='460100000'

    使用Python有更好的方法


    因为Python3中有内置的排列组合函数
    python内置函数-排列组合函数:
    具体用法可以查询Python3的API

    product 笛卡尔积  (有放回抽样排列)
    permutations 排列  (不放回抽样排列)
    combinations 组合,没有重复  (不放回抽样组合)
    combinations_with_replacement 组合,有重复  (有放回抽样组合)


    不定期会发布一些实用的Java开发文章
  • 相关阅读:
    小心!你被“大数据”锁定了
    深入浅出安卓,怎样从零学好移动开发
    Cocos2d-x3.0触摸
    将Spring源代码导入eclipse步骤
    vertica时间计算SQL语句实例:统计一天内登录的用户
    cocos2d-x 2.2 创建项目
    Codeforces-475B Strongly Connected City
    java socket通信-传输文件图片--传输图片
    listView解决滑动时黑色背景问题
    UVa 10450
  • 原文地址:https://www.cnblogs.com/lr393993507/p/14842270.html
Copyright © 2020-2023  润新知