中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 如何獲取兩個List的交集和差集

發布時間:2020-10-30 16:13:05 來源:億速云 閱讀:2431 作者:Leah 欄目:開發技術

這篇文章運用簡單易懂的例子給大家介紹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的交集和差集就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卢龙县| 静海县| 嘉鱼县| 马尔康县| 长岛县| 楚雄市| 唐河县| 安陆市| 凤阳县| 吴江市| 凉城县| 青海省| 雷州市| 邳州市| 壤塘县| 会昌县| 务川| 建瓯市| 灵台县| 承德市| 九龙县| 宁蒗| 康乐县| 霍林郭勒市| 遂溪县| 潞西市| 民乐县| 南宫市| 南京市| 正蓝旗| 枣强县| 于田县| 阿图什市| 凌云县| 高唐县| 惠安县| 赞皇县| 普安县| 长泰县| 甘肃省| 清镇市|