1. 程式人生 > 程式設計 >Java 獲取兩個List的交集和差集,以及應用場景操作

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));

  }
}

總結

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

程式碼連結: github

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