复杂模式的两个List与Map合并为一个Map的拼接;笛卡尔乘积处理数据问题
简介 (Introduction):
背景
数据从多个表中获取,每个表的数据条数不是唯一的,最后结果要拼接成一个Map<String,Object>的模式封装所有数据,每个数据是一条.结构图
要把如下图的数据模型,转化成第二个json的数据结构
1 [
2 {
3 "layer": "2",
4 "middlePhone": [
5 {
6 "cardId": "3561245787803",
7 "hardCode": "40080095621",
8 "phoneNumber": "13564151251"
9 },
10 {
11 "cardId": "356124580222356",
12 "hardCode": "5008009565822",
13 "phoneNumber": "12564151252"
14 },
15 {
16 "cardId": "3561245801",
17 "hardCode": "60080095623",
18 "phoneNumber": "14564151253"
19 }
20 ],
21 "phoneOne": [
22 {
23 "cardId": "3569999999",
24 "hardCode": "4008009556"
25 },
26 {
27 "cardId": "45699888888",
28 "hardCode": "5008009557"
29 }
30 ],
31 "phoneTwo": [
32 {
33 "cardId": "35699966666",
34 "hardCode": "4008009558"
35 },
36 {
37 "cardId": "45699888777",
38 "hardCode": "5008009559"
39 }
40 ],
41 "times": "20200326,20200508"
42 }
43 ]转化为

1 [
2 {
3 "cardIdA": "3569999999",
4 "cardIdB": "35699966666",
5 "hardCodeB": "4008009558",
6 "hardCodeA": "4008009556",
7 "cardId": "3561245803",
8 "hardCode": "3561245803",
9 "middlePhone": "13564151251"
10 },
11 {
12 "cardIdA": "3569999999",
13 "cardIdB": "35699966666",
14 "hardCodeB": "4008009558",
15 "hardCodeA": "4008009556",
16 "cardId": "3561245802",
17 "hardCode": "3561245802",
18 "middlePhone": "12564151252"
19 },
20 {
21 "cardIdA": "3569999999",
22 "cardIdB": "35699966666",
23 "hardCodeB": "4008009558",
24 "hardCodeA": "4008009556",
25 "cardId": "3561245801",
26 "hardCode": "3561245801",
27 "middlePhone": "14564151253"
28 },
29 {
30 "cardIdA": "45699888888",
31 "cardIdB": "35699966666",
32 "hardCodeB": "4008009558",
33 "hardCodeA": "5008009557",
34 "cardId": "3561245803",
35 "hardCode": "3561245803",
36 "middlePhone": "13564151251"
37 },
38 {
39 "cardIdA": "45699888888",
40 "cardIdB": "35699966666",
41 "hardCodeB": "4008009558",
42 "hardCodeA": "5008009557",
43 "cardId": "3561245802",
44 "hardCode": "3561245802",
45 "middlePhone": "12564151252"
46 },
47 {
48 "cardIdA": "45699888888",
49 "cardIdB": "35699966666",
50 "hardCodeB": "4008009558",
51 "hardCodeA": "5008009557",
52 "cardId": "3561245801",
53 "hardCode": "3561245801",
54 "middlePhone": "14564151253"
55 },
56 {
57 "cardIdA": "3569999999",
58 "cardIdB": "45699888777",
59 "hardCodeB": "5008009559",
60 "hardCodeA": "4008009556",
61 "cardId": "3561245803",
62 "hardCode": "3561245803",
63 "middlePhone": "13564151251"
64 },
65 {
66 "cardIdA": "3569999999",
67 "cardIdB": "45699888777",
68 "hardCodeB": "5008009559",
69 "hardCodeA": "4008009556",
70 "cardId": "3561245802",
71 "hardCode": "3561245802",
72 "middlePhone": "12564151252"
73 },
74 {
75 "cardIdA": "3569999999",
76 "cardIdB": "45699888777",
77 "hardCodeB": "5008009559",
78 "hardCodeA": "4008009556",
79 "cardId": "3561245801",
80 "hardCode": "3561245801",
81 "middlePhone": "14564151253"
82 },
83 {
84 "cardIdA": "45699888888",
85 "cardIdB": "45699888777",
86 "hardCodeB": "5008009559",
87 "hardCodeA": "5008009557",
88 "cardId": "3561245803",
89 "hardCode": "3561245803",
90 "middlePhone": "13564151251"
91 },
92 {
93 "cardIdA": "45699888888",
94 "cardIdB": "45699888777",
95 "hardCodeB": "5008009559",
96 "hardCodeA": "5008009557",
97 "cardId": "3561245802",
98 "hardCode": "3561245802",
99 "middlePhone": "12564151252"
100 },
101 {
102 "cardIdA": "45699888888",
103 "cardIdB": "45699888777",
104 "hardCodeB": "5008009559",
105 "hardCodeA": "5008009557",
106 "cardId": "3561245801",
107 "hardCode": "3561245801",
108 "middlePhone": "14564151253"
109 }
110 ]
- 核心
存在多对多的数据结构变化,考虑了很多方法和遍历方式,最后,采用了笛卡尔乘积的算法模式,实现了功能- 快速上手(Getting Started)
实体类模型
1 public class NumPhone {
2
3 private String hardCode;
4
5 private String cardId;
6
7
8 public String getHardCode() {
9 return hardCode;
10 }
11
12 public void setHardCode(String hardCode) {
13 this.hardCode = hardCode;
14 }
15
16 public String getCardId() {
17 return cardId;
18 }
19
20 public void setCardId(String cardId) {
21 this.cardId = cardId;
22 }
23 }
1 public class AllPhone {
2
3 private List<NumPhone> phoneOne;
4
5 private List<NumPhone> phoneTwo;
6
7 private String times;
8
9 private String layer;
10
11 private List<MiddleData> middlePhone;
12
13
14 public List<NumPhone> getPhoneOne() {
15 return phoneOne;
16 }
17
18 public void setPhoneOne(List<NumPhone> phoneOne) {
19 this.phoneOne = phoneOne;
20 }
21
22 public List<NumPhone> getPhoneTwo() {
23 return phoneTwo;
24 }
25
26 public void setPhoneTwo(List<NumPhone> phoneTwo) {
27 this.phoneTwo = phoneTwo;
28 }
29
30 public String getTimes() {
31 return times;
32 }
33
34 public void setTimes(String times) {
35 this.times = times;
36 }
37
38 public String getLayer() {
39 return layer;
40 }
41
42 public void setLayer(String layer) {
43 this.layer = layer;
44 }
45
46 public List<MiddleData> getMiddlePhone() {
47 return middlePhone;
48 }
49
50 public void setMiddlePhone(List<MiddleData> middlePhone) {
51 this.middlePhone = middlePhone;
52 }
53 }测试代码

1 public class Testphone {
2
3
4 public static void main(String[] args) {
5
6
7 AllPhone dateDemo = createDateDemo();
8
9
10 List<Map<String, Object>> stringsMap = new ArrayList<>();
11
12 for (MiddleData middleData : dateDemo.getMiddlePhone()) {
13
14 Map<String, Object> stringMap = new HashMap<>();
15
16 stringMap.put("middlePhone", middleData.getPhoneNumber());
17 stringMap.put("hardCode", middleData.getCardId());
18 stringMap.put("cardId", middleData.getCardId());
19
20 stringsMap.add(stringMap);
21 }
22
23 List<Map<String, Object>> stringsMap2 = getResult(dateDemo.getPhoneOne(), "hardCodeA", "cardIdA");
24 List<Map<String, Object>> stringsMap4 = getResult(stringsMap, stringsMap2);
25 List<Map<String, Object>> result1 = getResult(dateDemo.getPhoneTwo(), "hardCodeB", "cardIdB");
26 List<Map<String, Object>> stringsMap5 = getResult(stringsMap4, result1);
27
28
29 System.out.println("map:" + JSONArray.fromObject(stringsMap4));
30 System.out.println("map:" + JSONArray.fromObject(stringsMap5));
31 System.out.println("map:" + JSONArray.fromObject(dateDemo));
32
33
34
35
36
37 }
38
39 private static List<Map<String, Object>> getResult(List<Map<String, Object>> result,
40 List<Map<String, Object>> stringsMap
41 ){
42
43 List<List<Map<String, Object>>> stringsMapAll = getCombinResult(stringsMap, result);
44 List<List<Map<String, Object>>> result2 = new ArrayList<>();
45 descartes(stringsMapAll, result2, 0, new ArrayList<>());
46
47 System.out.println("map:" + JSONArray.fromObject(result2));
48 return getCombineFinalResult(result2);
49 }
50
51 private static List<Map<String, Object>> getCombineFinalResult(List<List<Map<String, Object>>> result) {
52 List<Map<String, Object>> stringsMap4 = new ArrayList<>();
53
54 for (List<Map<String, Object>> maps : result) {
55 Map<String, Object> stringsMap3 = new HashMap<>();
56 Map<String, Object> objectMap = maps.get(0);
57
58 Map<String, Object> objectMap1 = maps.get(1);
59
60 stringsMap3.putAll(objectMap);
61 stringsMap3.putAll(objectMap1);
62
63 stringsMap4.add(stringsMap3);
64 }
65 return stringsMap4;
66 }
67
68 private static List<List<Map<String, Object>>> getCombinResult(List<Map<String, Object>> stringsMap, List<Map<String, Object>> stringsMap2) {
69 List<List<Map<String, Object>>> stringsMapAll = new ArrayList<>();
70 stringsMapAll.add(stringsMap);
71 stringsMapAll.add(stringsMap2);
72 return stringsMapAll;
73 }
74
75 private static List<Map<String, Object>> getResult(List<NumPhone> phoneNumbers,String hardKey,String cardKey) {
76
77 List<Map<String, Object>> stringsMap = new ArrayList<>();
78 for (NumPhone numPhone : phoneNumbers) {
79
80 Map<String, Object> stringMap = new HashMap<>();
81
82 stringMap.put(hardKey, numPhone.getHardCode());
83 stringMap.put(cardKey, numPhone.getCardId());
84
85 stringsMap.add(stringMap);
86 }
87 return stringsMap;
88 }
89
90
91 public static AllPhone createDateDemo() {
92
93 AllPhone allPhone = new AllPhone();
94
95
96 List<NumPhone> numPhonesOne = new ArrayList<>();
97
98
99 NumPhone numPhone = new NumPhone();
100
101 numPhone.setHardCode("4008009556");
102 numPhone.setCardId("3569999999");
103
104 NumPhone numPhone2 = new NumPhone();
105
106 numPhone2.setHardCode("5008009557");
107 numPhone2.setCardId("45699888888");
108
109 numPhonesOne.add(numPhone);
110 numPhonesOne.add(numPhone2);
111
112
113 List<NumPhone> numPhonesTwo = new ArrayList<>();
114
115 NumPhone numPhone3 = new NumPhone();
116
117 numPhone3.setHardCode("4008009558");
118 numPhone3.setCardId("35699966666");
119
120 NumPhone numPhone4 = new NumPhone();
121
122 numPhone4.setHardCode("5008009559");
123 numPhone4.setCardId("45699888777");
124
125 numPhonesTwo.add(numPhone3);
126 numPhonesTwo.add(numPhone4);
127
128
129 List<MiddleData> middlePhone = new ArrayList<>();
130
131 MiddleData middleData1 = new MiddleData();
132
133 middleData1.setPhoneNumber("13564151251");
134 middleData1.setHardCode("40080095621");
135 middleData1.setCardId("3561245803");
136
137 MiddleData middleData2 = new MiddleData();
138 middleData2.setPhoneNumber("12564151252");
139 middleData2.setHardCode("50080095622");
140 middleData2.setCardId("3561245802");
141
142 MiddleData middleData3 = new MiddleData();
143 middleData3.setPhoneNumber("14564151253");
144 middleData3.setHardCode("60080095623");
145 middleData3.setCardId("3561245801");
146
147 middlePhone.add(middleData1);
148 middlePhone.add(middleData2);
149 middlePhone.add(middleData3);
150
151 allPhone.setPhoneOne(numPhonesOne);
152 allPhone.setPhoneTwo(numPhonesTwo);
153 allPhone.setMiddlePhone(middlePhone);
154
155 allPhone.setLayer("2");
156
157 allPhone.setTimes("20200326,20200508");
158
159
160 return allPhone;
161
162 }
163
164
165 private static void descartes(List<List<Map<String, Object>>> dimvalue,
166 List<List<Map<String, Object>>> result,
167 int layer,
168 List<Map<String, Object>> curList) {
169 if (layer < dimvalue.size() - 1) {
170 if (dimvalue.get(layer).size() == 0) {
171 descartes(dimvalue, result, layer + 1, curList);
172 } else {
173 for (int i = 0; i < dimvalue.get(layer).size(); i++) {
174 List<Map<String, Object>> list = new ArrayList<>(curList);
175 list.add(dimvalue.get(layer).get(i));
176 descartes(dimvalue, result, layer + 1, list);
177 }
178 }
179 } else if (layer == dimvalue.size() - 1) {
180 if (dimvalue.get(layer).size() == 0) {
181 result.add(curList);
182 } else {
183 for (int i = 0; i < dimvalue.get(layer).size(); i++) {
184 List<Map<String, Object>> list = new ArrayList<>(curList);
185 list.add(dimvalue.get(layer).get(i));
186 result.add(list);
187 }
188 }
189 }
190 }
191 }
- 快速上手(Getting Started)
环境设置 (Prerequisite):
环境
JDK1.8配置
windows和mac/linux环境自行配置存在问题
暂无
进阶篇 (Advanced):
待开发 ......
复杂模式的两个List与Map合并为一个Map的拼接;笛卡尔乘积处理数据问题的更多相关文章
- Clojure:将两个list合并成一个map
假设我们有两个list,分别是: (def a [“one” “two” “three”]) (def b [1 2 3]) 我们要把它们合为一个键值对应的map,做法很简单: 1. 先将a和b合为一 ...
- java map添加另一个map时候 键值对的类型要一致
java map添加另一个map时候 键值对的类型要一致
- Mysql训练:两个表中使用 Select 语句会导致产生 笛卡尔乘积 ,两个表的前后顺序决定查询之后的表顺序
力扣:超过经理收入的员工 Employee 表包含所有员工,他们的经理也属于员工.每个员工都有一个 Id,此外还有一列对应员工的经理的 Id. +----+-------+--------+----- ...
- Java 将两个Map对象合并为一个Map对象
实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
标签: SQL合并数据 2013-08-21 10:41 489人阅读 评论(0) 收藏 举报 分类: Oracle数据库(14) select * into 新表名 from (select ...
- C++ map insert 另一个map的子集
C++map中 会有insert操作,举个例子 存在map A,我们截取一部分到map B中,void insert (InputIterator first, InputIterator last) ...
- PHP将两个二维数组合并为一个二维数组的方法
$a = array(0 => Array(id => 66,class_name => math),1 => Array(id => 67,class_name =&g ...
- C语言两个升序递增链表逆序合并为一个降序递减链表,并去除重复元素
#include"stdafx.h" #include<stdlib.h> #define LEN sizeof(struct student) struct stud ...
- 探究Repository模式的两种写法与疑惑
现如今DDD越来越流行,园子里漫天都是介绍关于它的文章.说到DDD就不能不提Repository模式了,有的地方也叫它仓储模式. 很多时候我们对Repository都还停留在Copy然后使用的阶段, ...
- 通知模式实现两个textField传值及模态视图——iOS开发
通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...
随机推荐
- [llama懒人包]ChatGPT本地下位替代llama-7b,支持全平台显卡/CPU运行
LLAMA的懒人包: 链接: https://pan.baidu.com/s/1xOw8-eP8QB--u6y644_UPg?pwd=0l08 提取码:0l08 模型来源:elinas/llama-7 ...
- Spring Boot 嵌入式服务器、Hibernate 关系和 Spring Data 全解析
嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中.这使得开发.测试和部署 Web ...
- C#_面试题2
1 :维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方式可以保证无论何种 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(2)
1.问题描述: 开发服务端推送,客户端能收到离线推送,但是推送收到的通知只能从手机顶部下拉看到,无法收到一个顶部的弹框.请问是什么原因? 解决方案: 可能原因一: 消息提醒的方式与消息类别有关,比如: ...
- CentOS上搭建FTP服务器[未测试]
centos ftp服务器 linux service upload 防火墙 本文参考了网上的几篇博文,在CentOS上搭建FTP服务器,两种搭建方式:gssftp与vsftpd. RedHat和Ce ...
- BI 和报表有什么区别
BI 从早期提出的概念上来划分可以分为数据仓库.ETL.olap 和报表这几部分可以看到报表只是 BI 中的一个组成部分,只不过数据在 web 端展示时通常是通过报表形式,所以经常会把报表当做是 BI ...
- 接口文档神器apidoc
1.apidoc介绍 1.apidoc是什么? api文档生成工具:基于源代码备注创建的接口文档: 2.apidoc优势是啥? 超简单文档生成器:几乎支持目前主流的所有风格的注释, 如可在C#.Go. ...
- 力扣66(java)-加一(简单)
题目: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. ...
- 云效DevOps实践-如何基于云效实现测试自动化集成和分析
简介: 对于现代软件研发来说,持续.快速.高质量.低风险地交付需求特性,是业务对研发的主要诉求.而要做到这一点,除了要有良好的架构设计.卓越的工程能力,快速可靠的测试反馈也是其非常重要的一环,达到这一 ...
- [Caddy2] URL访问路径的重定向和重写规则 (redir/rewrite 指令)
当我们在规划网站路径时,为了保留搜索引擎收录 避免404的同时做到升级,常用到重定向跳转和URL重写. 重定向(redirect) 在 Caddy 中为 redir 指令. https://caddy ...