欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年09月25日 10:28:22   作者:回歸心靈  
這篇文章主要介紹了Java 獲取兩個List的交集和差集,以及應用場景操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

背景介紹

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

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

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

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

轉化為一般問題

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

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

經過上述分析,不難發(fā)現就是找出兩個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));

  }
}

總結

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

代碼鏈接: github

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

相關文章

  • 使用spring?security?BCryptPasswordEncoder接入系統(tǒng)

    使用spring?security?BCryptPasswordEncoder接入系統(tǒng)

    這篇文章主要介紹了使用spring?security?BCryptPasswordEncoder接入系統(tǒng)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java的分支結構與循環(huán)你知道多少

    Java的分支結構與循環(huán)你知道多少

    這篇文章主要為大家詳細介紹了Java的分支結構與循環(huán),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • SpringBoot實現Thymeleaf驗證碼生成

    SpringBoot實現Thymeleaf驗證碼生成

    本文使用SpringBoot實現Thymeleaf驗證碼生成,使用后臺返回驗證碼圖片,驗證碼存到session中后端實現校驗,前端只展示驗證碼圖片。感興趣的可以了解下
    2021-05-05
  • SpringBoot+jpa配置如何根據實體類自動創(chuàng)建表

    SpringBoot+jpa配置如何根據實體類自動創(chuàng)建表

    這篇文章主要介紹了SpringBoot+jpa配置如何根據實體類自動創(chuàng)建表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java均攤復雜度和防止復雜度的震蕩原理分析

    Java均攤復雜度和防止復雜度的震蕩原理分析

    這篇文章主要介紹了Java均攤復雜度和防止復雜度的震蕩,結合實例形式分析了Java均攤復雜度和防止復雜度的震蕩相關概念、原理、實現方法與注意事項,需要的朋友可以參考下
    2020-03-03
  • Springbean的幾種注入方式都了解嗎

    Springbean的幾種注入方式都了解嗎

    這篇文章主要介紹了Springbean的幾種注入方式都了解嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • SpringBoot集成PageHelper及使用方法詳解

    SpringBoot集成PageHelper及使用方法詳解

    這篇文章主要介紹了SpringBoot集成PageHelper及使用方法詳解,PageHelper 是一個開源的 Java 分頁插件,它可以幫助開發(fā)者簡化分頁操作,本文提供部分相關代碼,需要的朋友可以參考下
    2023-10-10
  • 如何使用Spring自定義Xml標簽

    如何使用Spring自定義Xml標簽

    要實現自定義的xml配置,需要有兩個默認spring配置文件來支持。一個是spring.schemas,一個是spring.handlers,前者是為了驗證你自定義的xml配置文件是否符合你的格式要求,后者是告訴spring該如何來解析你自定義的配置文件。本文將介紹如何使用Spring自定義Xml標簽
    2021-06-06
  • SpringBoot中生成二維碼的案例分享

    SpringBoot中生成二維碼的案例分享

    在Spring?Boot項目中整合ZXing庫來生成二維碼是一個常見的需求,zxing是一個功能強大的開源Java庫,專門用于二維碼的生成與解析,它支持Android、iOS、Java等多個平臺,本文小編將給大家分享SpringBoot中生成二維碼的案例,需要的朋友可以參考下
    2024-08-08
  • java 開發(fā)中網絡編程之IP、URL詳解及實例代碼

    java 開發(fā)中網絡編程之IP、URL詳解及實例代碼

    這篇文章主要介紹了java 開發(fā)中網絡編程之IP、URL詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03

最新評論