最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 獲取兩個(gè)List的交集和差集,以及應(yīng)用場景操作

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

背景介紹

在實(shí)際項(xiàng)目中,特別是一些管理后臺(tái)類的項(xiàng)目,會(huì)遇到底層數(shù)據(jù)是按照一對(duì)多關(guān)系的數(shù)據(jù)表存儲(chǔ)的管理界面。列表頁是一對(duì)多關(guān)系中一對(duì)應(yīng)的數(shù)據(jù)列表,二級(jí)的詳情頁中是一對(duì)多關(guān)系中多對(duì)應(yīng)的多條數(shù)據(jù)展示。通常二級(jí)頁面是能夠增、刪、改數(shù)據(jù)的編輯頁面,在點(diǎn)擊保存提交數(shù)據(jù)后,服務(wù)器端需要插入新增的數(shù)據(jù),刪除要?jiǎng)h除的數(shù)據(jù),更新改變的數(shù)據(jù)。

例如,在汽車電商領(lǐng)域,如果要實(shí)現(xiàn)一輛車型在不同省份有不同的價(jià)格行情,就需要有一個(gè)車價(jià)管理的后臺(tái)管理界面。每輛車對(duì)應(yīng)的詳情界面管理各省價(jià)格行情,增加該車在某個(gè)省份的行情,或者更新某個(gè)省份的行情,或者該車暫時(shí)去除某個(gè)省份的行情等功能,需要服務(wù)器端保證正確地?cái)?shù)據(jù)存儲(chǔ)。

交集:指的是兩個(gè)List對(duì)象中都有的元素。

差集:指的是一個(gè)List對(duì)象中有,而另一個(gè)List對(duì)象中沒有的元素。

轉(zhuǎn)化為一般問題

在車價(jià)管理的車輛詳情頁面點(diǎn)擊保存各省行情按鈕后,請(qǐng)求會(huì)傳送一組數(shù)據(jù)到服務(wù)端,服務(wù)端把這組數(shù)據(jù)保存到一個(gè)List對(duì)象中。然后從數(shù)據(jù)庫中獲取該車型之前的各省行情數(shù)據(jù)并保存到List對(duì)象中,那么怎么找出哪些數(shù)據(jù)是要新增的,哪些數(shù)據(jù)是要?jiǎng)h除的,又有哪些數(shù)據(jù)是要更新的呢?

如果客戶端傳送的數(shù)據(jù)中有的省份行情數(shù)據(jù),而數(shù)據(jù)庫中沒有該省行情數(shù)據(jù)記錄,則這些數(shù)據(jù)是要插入數(shù)據(jù)庫中的。如果客戶端傳送的數(shù)據(jù)有的省份行情數(shù)據(jù),數(shù)據(jù)庫中也有改省的行情數(shù)據(jù),則這些數(shù)據(jù)是要更新的數(shù)據(jù)。如果數(shù)據(jù)庫中有的省份數(shù)據(jù),而客戶端傳送的數(shù)據(jù)中沒有改省份數(shù)據(jù),則這些數(shù)據(jù)是要?jiǎng)h除的。

經(jīng)過上述分析,不難發(fā)現(xiàn)就是找出兩個(gè)List對(duì)象的交集和差集。例如,a為客戶端傳送的數(shù)據(jù)List對(duì)象,b為從數(shù)據(jù)庫中獲取的List對(duì)象。 a中有的元素,而b中沒有的元素就是要插入數(shù)據(jù)庫中的數(shù)據(jù),即a與b的差集。a和b共有的元素就是要更新的數(shù)據(jù),即a與b的交集。b中有的元素,a中沒有的就是要?jiǎng)h除的數(shù)據(jù),即b與a的差集。

程序代碼

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

各省行情類:

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

求兩個(gè)List對(duì)象交集、差集:

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 {
        //新建的元素,需要設(shè)置相關(guān)成員變量
        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));

  }
}

總結(jié)

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

代碼鏈接: github

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

相關(guān)文章

  • 兩個(gè)jar包下相同包名類名引入沖突的解決方法

    兩個(gè)jar包下相同包名類名引入沖突的解決方法

    本文主要介紹了兩個(gè)jar包下相同包名類名引入沖突的解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringCloud如何使用Eureka實(shí)現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)

    SpringCloud如何使用Eureka實(shí)現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)

    這篇文章主要介紹了SpringCloud使用Eureka實(shí)現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中判斷對(duì)象是否相等的equals()方法使用教程

    Java中判斷對(duì)象是否相等的equals()方法使用教程

    與==運(yùn)算符響應(yīng),equals()方法也是Java中對(duì)對(duì)象進(jìn)行比較的一大方式,要特別注意二者的不同點(diǎn),這個(gè)我們在下文中即將講到,接下來我們就來看一下Java中判斷對(duì)象是否相等的equals()方法使用教程
    2016-05-05
  • java中的取整與四舍五入方法實(shí)例

    java中的取整與四舍五入方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于java中取整與四舍五入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Maven的常用命令總結(jié)大全

    Maven的常用命令總結(jié)大全

    這篇文章主要給大家介紹了Maven常用命令總結(jié)的相關(guān)資料,maven最大的作用就是用于對(duì)項(xiàng)目中jar包依賴的統(tǒng)一管理,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java基礎(chǔ)入門語法--String類

    Java基礎(chǔ)入門語法--String類

    字符串廣泛應(yīng)用在Java編程中,在Java中字符串屬于對(duì)象,Java 提供了String類來創(chuàng)建和操作字符串,今天給大家介紹Java基礎(chǔ)入門語法--String類的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-06-06
  • IntelliJ IDEA中顯示和關(guān)閉工具欄與目錄欄的方法

    IntelliJ IDEA中顯示和關(guān)閉工具欄與目錄欄的方法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中顯示和關(guān)閉工具欄與目錄欄的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 詳解Java中CountDownLatch的用法

    詳解Java中CountDownLatch的用法

    這篇文章主要為大家詳細(xì)介紹了Java中CountDownLatch類的用法,本文通過一些簡單的示例進(jìn)行了簡單介紹,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • VMware虛擬機(jī)下hadoop1.x的安裝方法

    VMware虛擬機(jī)下hadoop1.x的安裝方法

    這篇文章主要為大家詳細(xì)介紹了VMware虛擬機(jī)下hadoop1.x的安裝方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 詳解JVM的分代模型

    詳解JVM的分代模型

    這篇文章主要介紹了JVM的分代模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java虛擬機(jī)相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-10-10

最新評(píng)論

海城市| 广昌县| 图木舒克市| 刚察县| 左贡县| 乐平市| 渭源县| 河源市| 顺义区| 随州市| 葵青区| 鹿邑县| 临沭县| 依兰县| 南华县| 汾阳市| 始兴县| 潞城市| 丁青县| 凤山县| 无为县| 邹平县| 陈巴尔虎旗| 蚌埠市| 滕州市| 东乌珠穆沁旗| 衢州市| 锡林郭勒盟| 北安市| 龙口市| 弥勒县| 当涂县| 延津县| 准格尔旗| 马尔康县| 阜新| 海城市| 周口市| 高州市| 蒙自县| 沙湾县|