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 组合,有重复  (有放回抽样组合)


posted @ 2021-06-02 17:55  魔流剑  阅读(2310)  评论(0编辑  收藏  举报