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开发文章