Java实现多条相同数据合并为一条数据
標題
- 前言
- 方法一: List 不建議使用
- 方法二: Map 不建議使用
- 方法三: sql實現 ==最簡單 不用動腦、推薦使用==
- 方法四,推薦使用
- 一條數據拆分多條數據
前言
首先說明一下場景啊,今天遇到個業務問題,就是通過一個主表,關聯另一個表,主表中一條數據,關聯出另外一張表多條數據,導致主表也生成了多條重復數據。但我頁面展示的時候不希望展示出重復數據。這是我們的業務需求,現在我們來看看有多少方法來解決這個問題。
  注:這塊可不是數組去重,關于集合數組去重的方法參考。
 
為了便于理解,我先把模擬一下數據。
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (`id` int(0) NOT NULL,`equalDate1` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`equalDate2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`equalDate3` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`age` int(0) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, '相同數據1', '相同數據2', '相同數據3', '張三', 10); INSERT INTO `student` VALUES (2, '相同數據1', '相同數據2', '相同數據3', '李四', 12); INSERT INTO `student` VALUES (3, '相同數據1', '相同數據2', '相同數據3', '王五', 10); INSERT INTO `student` VALUES (4, '相同數據1', '相同數據2', '相同數據3', '王麻子', 10); INSERT INTO `student` VALUES (5, '相同數據11', '相同數據21', '相同數據31', '張三1', 10); INSERT INTO `student` VALUES (6, '相同數據11', '相同數據21', '相同數據31', '張三2', 10);SET FOREIGN_KEY_CHECKS = 1;CREATE TABLE `student` (`id` int NOT NULL,`equalDate1` varchar(20) DEFAULT NULL,`equalDate2` varchar(255) DEFAULT NULL,`equalDate3` varchar(20) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`age` int(4) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;select * from student; INSERT INTO student (id,equalDate1,equalDate2,equalDate3,`name`,age) VALUES(1,"相同數據1", "相同數據2", "相同數據3","張三",10), (2,"相同數據1", "相同數據2", "相同數據3","李四",12), (3,"相同數據1", "相同數據2", "相同數據3","王五",10), (4,"相同數據1", "相同數據2", "相同數據3","王麻子",10), (5,"相同數據11", "相同數據21", "相同數據31","張三1",10), (6,"相同數據11", "相同數據21", "相同數據31","張三2",10)select equalDate1,equalDate2,equalDate3 ,GROUP_CONCAT(`name`)as nameList,GROUP_CONCAT(`age`)as ageListfrom student GROUP BY equalDate1,equalDate2,equalDate3CREATE TABLE `studentleft` (`id` int NOT NULL,`tableid` int NOT NULL,`name` varchar(20) DEFAULT NULL,`age` int(4) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;select * from studentleft; INSERT INTO studentleft (id,tableid,`name`,age) VALUES(1,1, "張三",10), (2,1,"李四",12), (3,1,"王五",10), (4,1,"王麻子",10), (5,2,"張三1",10), (6,2,"張三2",10)select s.equalDate1,s.equalDate2,s.equalDate3 from student s where s.tableid = 1; select l.`name`,l.age from studentleft l where l.tableid = 1; select s.equalDate1,s.equalDate2,s.equalDate3,l.`name`,l.agefrom student s ,studentleft l where s.tableid = l.tableid and s.tableid = 1實現功能 主表一條數據關聯后產生多條數據,現在就想要展示一條數據。
 
 
 
 我們先說笨辦法 list、map 方法?,F實實現不建議這么玩,這里只是學習一下思維,這塊還折騰了我前后4個來小時,還是記錄一下編碼過程
 這塊我沒有連接數據庫查,我就模仿了一下查到的集合數
方法一: List 不建議使用
package test;import java.util.ArrayList; import java.util.List;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/ public class TestCollByList {public static void main(String[] args) {//合并相同數據之 使用 list實現//下面是模擬合并 代碼調試了3個來小時,注意旗幟判斷 跟 i-- 以及最后在保存一次 不容有失Student student1 = new Student("相同數據1", "相同數據2", "相同數據3", "張三", 10);Student student2 = new Student("相同數據1", "相同數據2", "相同數據3", "李四", 12);Student student3 = new Student("相同數據1", "相同數據2", "相同數據3", "王五", 10);Student student4 = new Student("相同數據1", "相同數據2", "相同數據3", "王麻子", 10);Student student5 = new Student("相同數據11", "相同數據21", "相同數據31", "張三1", 10);Student student6 = new Student("相同數據11", "相同數據21", "相同數據31", "張三2", 10);//首先說明一下 前三個數據是一致的 不一致的只是后面2個 像上面6條數據 按照我們需求其實就兩條數據 ,// 也就是我們要合并前3項的結果為一條,后面兩條變成一個兩個List返回 也是我們的需求List<Student> studentList = new ArrayList<>();List<Student> studentListNew = new ArrayList<>();studentList.add(student1);studentList.add(student2);studentList.add(student3);studentList.add(student4);studentList.add(student5);studentList.add(student6);String flag = "";List listName = new ArrayList();List listAge = new ArrayList();int size = studentList.size();for (int i = 0; i < size; i++) {if (i == 0) {flag = studentList.get(0).getEqualDate1();}//String falgType = studentList.get(i).getEqualDate1();if (flag.equals(studentList.get(i).getEqualDate1())) {listAge.add(studentList.get(i).getAge());listName.add(studentList.get(i).getName());//這里也必須放個旗幟判斷flag = studentList.get(i).getEqualDate1();} else {Student student = new Student();student.setEqualDate1(studentList.get(i - 1).getEqualDate1());student.setEqualDate2(studentList.get(i - 1).getEqualDate2());student.setEqualDate3(studentList.get(i - 1).getEqualDate3());student.setAgeList(listAge);student.setNameList(listName);studentListNew.add(student);//下面必須清空上次保留的歷史信息listName = new ArrayList();listAge = new ArrayList();//這個旗幟判斷必須放這里不被下面 i--影響flag = studentList.get(i).getEqualDate1();i--;//這步很關鍵,因為走else 就走不了if i又在自增,你滿足if時就少一條}//這個是最后一步保存下來,if (i == size-1) {Student student = new Student();student.setEqualDate1(studentList.get(i - 1).getEqualDate1());student.setEqualDate2(studentList.get(i - 1).getEqualDate2());student.setEqualDate3(studentList.get(i - 1).getEqualDate3());student.setAgeList(listAge);student.setNameList(listName);studentListNew.add(student);}}} }方法二: Map 不建議使用
package test;import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/ public class TestCollByMap {public static void main(String[] args) {//合并相同數據之 使用 Map實現 map特點 同key覆蓋 跟list邏輯一樣Student student1 = new Student("相同數據1", "相同數據2", "相同數據3", "張三", 10);Student student2 = new Student("相同數據1", "相同數據2", "相同數據3", "李四", 12);Student student3 = new Student("相同數據1", "相同數據2", "相同數據3", "王五", 10);Student student4 = new Student("相同數據1", "相同數據2", "相同數據3", "王麻子", 10);Student student5 = new Student("相同數據11", "相同數據21", "相同數據31", "張三1", 10);Student student6 = new Student("相同數據11", "相同數據21", "相同數據31", "張三2", 10);//首先說明一下 前三個數據是一致的 不一致的只是后面2個 像上面6條數據 按照我們需求其實就兩條數據 ,// 也就是我們要合并前3項的結果為一條,后面兩條變成一個兩個List返回 也是我們的需求List<Student> studentList = new ArrayList<>();Map map = new LinkedHashMap();//有序,保留原有順序List<Map> all = new ArrayList<>();studentList.add(student1);studentList.add(student2);studentList.add(student3);studentList.add(student4);studentList.add(student5);studentList.add(student6);String flag = "";List listName = new ArrayList();List listAge = new ArrayList();int size = studentList.size();for (int i = 0; i < size; i++) {if (i == 0) {flag = studentList.get(0).getEqualDate1();}if (flag.equals(studentList.get(i).getEqualDate1())) {listAge.add(studentList.get(i).getAge());listName.add(studentList.get(i).getName());//這里也必須放個旗幟判斷flag = studentList.get(i).getEqualDate1();map.put("equalDate1",studentList.get(i).getEqualDate1());map.put("equalDate2",studentList.get(i).getEqualDate2());map.put("equalDate3",studentList.get(i).getEqualDate3());map.put("ageList",listAge);map.put("nameList",listName);} else {//下面必須清空上次保留的歷史信息listName = new ArrayList();listAge = new ArrayList();all.add(map);map = new LinkedHashMap();//todo 防止同名覆蓋問題 很關鍵//這個旗幟判斷必須放這里不被下面 i--影響flag = studentList.get(i).getEqualDate1();i--;//這步很關鍵,因為走else 就走不了if i又在自增,你滿足if時就少一條}//這個是最后一步保存下來,if (i == size-1) {all.add(map);}}} }方法三: sql實現 最簡單 不用動腦、推薦使用
package test;import java.util.ArrayList; import java.util.Arrays; import java.util.List;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/ public class TestCollBySql {public static void main(String[] args) {//合并相同數據之 使用 sql實現 最簡單 不用動腦//我們通過sql中的 group_concat()函數,把數據直接干到一條, 把姓名,年齡 用,分割//現在如果說前端來處理的話后端已經完事了,如果前端不想處理,讓我們反對應的listStudent student1 = new Student("相同數據1", "相同數據2", "相同數據3", "張三,李四,王五,王麻子", "10,12,10,10");Student student5 = new Student("相同數據11", "相同數據21", "相同數據31", "張三1,張三2", "10,10");//首先說明一下 前三個數據是一致的 不一致的只是后面2個 像上面6條數據 按照我們需求其實就兩條數據 ,// 也就是我們要合并前3項的結果為一條,后面兩條變成一個兩個List返回 也是我們的需求List<Student> studentList = new ArrayList<>();studentList.add(student1);studentList.add(student5);for (Student student : studentList) {String[] splitAge = student.getStringAge().split(",");String[] splitName = student.getName().split(",");student.setNameList(Arrays.asList(splitName));student.setAgeList(Arrays.asList(splitAge));}System.out.println(studentList);}}方法四,推薦使用
這塊我不在再寫具體操作,因為我就是用這個解決問題的,現在時間也很晚了就不再寫了。
思想:我們兩張表分開查,我們查出主表所有數據,我們前面說過,主表數據是不重復的,通過主表關聯id去查另外一張表,查出它的集合,然后在 主表定義對應的list字段 來接受查出來的list。可能光這么描述看不太懂,我隨后賦個截圖吧。
select s.equalDate1,s.equalDate2,s.equalDate3 from student s where s.tableid = 1;select l.`name`,l.age from studentleft l where l.tableid = 1;一條數據拆分多條數據
(正常來說我們查出來的數據就是多條的,不需要做處理就是一對多)
 既然有多對一,就有一對多,比如導出數據的時候,我就需要把你合并為1條的數據拆分好幾條,然后再利用表格合并相同數據。
這塊方法也很多,我就不 一 一 列舉了,
 
上面這么寫返回的參數形式有些惡心,進行如下優化
 其實也不是多么惡心,只不過是都放在一個類中的對應list里,無傷大雅
 
同樣是返回兩條數據,這么看起來層次感就很好
 
總結
以上是生活随笔為你收集整理的Java实现多条相同数据合并为一条数据的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: iOS淘宝授权登录及跳转淘宝页面
- 下一篇: CentOS部署ElasticSearc
