您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹Java 如何獲取兩個List的交集和差集,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
交集:指的是兩個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中的元素,并添加到sameMap CarProvinceMarket 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)); } }
關于Java 如何獲取兩個List的交集和差集就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。