日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现多条相同数据合并为一条数据

發布時間:2023/12/14 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 方法。現實實現不建議這么玩,這里只是學習一下思維,這塊還折騰了我前后4個來小時,還是記錄一下編碼過程
這塊我沒有連接數據庫查,我就模仿了一下查到的集合數

package test;import java.util.List;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/ public class Student {//這樣相同數據 就展示一條 (把多條年齡、姓名用List接收)public String equalDate1;//相同數據public String equalDate2;//相同數據public String equalDate3;//相同數據public String name;public int age;public String stringAge;public List ageList; //存放年齡集合public List nameList; //拿到姓名集合public Student() {}public Student(String equalDate1, String equalDate2, String equalDate3, String name, int age) {this.equalDate1 = equalDate1;this.equalDate2 = equalDate2;this.equalDate3 = equalDate3;this.name = name;this.age = age;}public Student(String equalDate1, String equalDate2, String equalDate3, String name,String stringAge) {this.equalDate1 = equalDate1;this.equalDate2 = equalDate2;this.equalDate3 = equalDate3;this.name = name;this.stringAge = stringAge;}public String getStringAge() {return stringAge;}public void setStringAge(String stringAge) {this.stringAge = stringAge;}public String getEqualDate1() {return equalDate1;}public void setEqualDate1(String equalDate1) {this.equalDate1 = equalDate1;}public String getEqualDate2() {return equalDate2;}public void setEqualDate2(String equalDate2) {this.equalDate2 = equalDate2;}public String getEqualDate3() {return equalDate3;}public void setEqualDate3(String equalDate3) {this.equalDate3 = equalDate3;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List getAgeList() {return ageList;}public void setAgeList(List ageList) {this.ageList = ageList;}public List getNameList() {return nameList;}public void setNameList(List nameList) {this.nameList = nameList;} }

方法一: 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实现多条相同数据合并为一条数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。