溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java 如何獲取兩個(gè)List的交集和差集

發(fā)布時(shí)間:2020-10-30 16:13:05 來(lái)源:億速云 閱讀:2424 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹Java 如何獲取兩個(gè)List的交集和差集,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

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

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

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

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

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

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

各省行情類(lèi):

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

  }
}

關(guān)于Java 如何獲取兩個(gè)List的交集和差集就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI