电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 獲取兩個List的交集和差集,以及應用場景操作

瀏覽:5日期:2022-08-23 18:40:23

背景介紹

在實際項目中,特別是一些管理后臺類的項目,會遇到底層數據是按照一對多關系的數據表存儲的管理界面。列表頁是一對多關系中一對應的數據列表,二級的詳情頁中是一對多關系中多對應的多條數據展示。通常二級頁面是能夠增、刪、改數據的編輯頁面,在點擊保存提交數據后,服務器端需要插入新增的數據,刪除要刪除的數據,更新改變的數據。

例如,在汽車電商領域,如果要實現一輛車型在不同省份有不同的價格行情,就需要有一個車價管理的后臺管理界面。每輛車對應的詳情界面管理各省價格行情,增加該車在某個省份的行情,或者更新某個省份的行情,或者該車暫時去除某個省份的行情等功能,需要服務器端保證正確地數據存儲。

交集:指的是兩個List對象中都有的元素。

差集:指的是一個List對象中有,而另一個List對象中沒有的元素。

轉化為一般問題

在車價管理的車輛詳情頁面點擊保存各省行情按鈕后,請求會傳送一組數據到服務端,服務端把這組數據保存到一個List對象中。然后從數據庫中獲取該車型之前的各省行情數據并保存到List對象中,那么怎么找出哪些數據是要新增的,哪些數據是要刪除的,又有哪些數據是要更新的呢?

如果客戶端傳送的數據中有的省份行情數據,而數據庫中沒有該省行情數據記錄,則這些數據是要插入數據庫中的。如果客戶端傳送的數據有的省份行情數據,數據庫中也有改省的行情數據,則這些數據是要更新的數據。如果數據庫中有的省份數據,而客戶端傳送的數據中沒有改省份數據,則這些數據是要刪除的。

經過上述分析,不難發現就是找出兩個List對象的交集和差集。例如,a為客戶端傳送的數據List對象,b為從數據庫中獲取的List對象。 a中有的元素,而b中沒有的元素就是要插入數據庫中的數據,即a與b的差集。a和b共有的元素就是要更新的數據,即a與b的交集。b中有的元素,a中沒有的就是要刪除的數據,即b與a的差集。

程序代碼

程序的大致思路是:利用LinkedHashMap key值的唯一性和順序存儲的特性,把provinceId作為key值,先用一個map添加一個List元素,然后再去比較另一個List對象中的元素,找出provinceId相同的對象和只有b中才有的對象。map中去除相同的key值的對象,剩余的就是a中獨有的元素。

各省行情類:

public class CarProvinceMarket { private Integer id; private Integer carId; private Integer provinceId; private Double price; private Integer createdBy; public Integer getCreatedBy() { return createdBy; } public void setCreatedBy(Integer createdBy) { this.createdBy = createdBy; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getCarId() { return carId; } public void setCarId(Integer carId) { this.carId = carId; } public Integer getProvinceId() { return provinceId; } public void setProvinceId(Integer provinceId) { this.provinceId = provinceId; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; }}

求兩個List對象交集、差集:

public class ListOperation { public static void sameAndDifferentOperation(List<CarProvinceMarket> a, List<CarProvinceMarket> b, List<CarProvinceMarket> sameItems, List<CarProvinceMarket> onlyAItems, List<CarProvinceMarket> onlyBItems){ if (a.isEmpty() && b.isEmpty()){ return; } LinkedHashMap<Integer, CarProvinceMarket> map = new LinkedHashMap<>(); LinkedHashMap<Integer, CarProvinceMarket> sameMap = new LinkedHashMap<>(); LinkedHashMap<Integer, CarProvinceMarket> onlyBMap = new LinkedHashMap<>(); for (CarProvinceMarket item: a){ map.put(item.getProvinceId(), item); } for (CarProvinceMarket item: b){ if (map.containsKey(item.getProvinceId())){//如果要更新a中的記錄,則要更新map中的元素,并添加到sameMapCarProvinceMarket carProvinceMarket = map.get(item.getProvinceId());carProvinceMarket.setPrice(100000d);sameMap.put(item.getProvinceId(), carProvinceMarket); }else {//新建的元素,需要設置相關成員變量item.setCreatedBy(4);onlyBMap.put(item.getProvinceId(),item); } } sameItems.addAll(sameMap.values()); onlyBItems.addAll(onlyBMap.values()); for (CarProvinceMarket item: sameItems){ map.remove(item.getProvinceId()); } onlyAItems.addAll(map.values()); } public static void main(String [] args){ ArrayList<CarProvinceMarket> aCarProMar = new ArrayList<>(); ArrayList<CarProvinceMarket> bCarProMar = new ArrayList<>(); for (int i=0; i<1000000; i++){ CarProvinceMarket aCar = new CarProvinceMarket(); aCar.setProvinceId((i + 1)/2); aCarProMar.add(aCar); CarProvinceMarket bCar = new CarProvinceMarket(); bCar.setProvinceId((i + 2)/2); bCarProMar.add(bCar); } LinkedList<CarProvinceMarket> sameItems = new LinkedList<>(); LinkedList<CarProvinceMarket> onlyAItems = new LinkedList<>(); LinkedList<CarProvinceMarket> onlyBItems = new LinkedList<>(); Long start = System.currentTimeMillis(); sameAndDifferentOperation(aCarProMar, bCarProMar, sameItems, onlyAItems, onlyBItems); System.out.println('time = ' + (System.currentTimeMillis() - start)); }}

總結

在開發過程中,遇到問題要找出問題的一般性,轉化概念,理解本質,方能解決問題。

代碼鏈接: github

以上這篇Java 獲取兩個List的交集和差集,以及應用場景操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
主站蜘蛛池模板: 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 郑州律师咨询-郑州律师事务所_河南锦盾律师事务所 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 长沙广告公司_制作,长沙喷绘_发光字_招牌制作_长沙泓润广告官网 长城人品牌官网 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 北京发电机出租_发电机租赁_北京发电机维修 - 河北腾伦发电机出租 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 万濠影像仪(万濠投影仪)百科-苏州林泽仪器 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | CPSE安博会| 螺杆泵_中成泵业| 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 盛源真空泵|空压机-浙江盛源空压机制造有限公司-【盛源官网】 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 防火阀、排烟防火阀、电动防火阀产品生产销售商-德州凯亿空调设备有限公司 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 南京和瑞包装有限公司| 方源木业官网-四川木门-全国木门专业品牌| 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 营养师网,营养师考试时间,报名入口—网站首页 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 |