软件编程
位置:首页>> 软件编程>> java编程>> Java 获取两个List的交集和差集,以及应用场景操作

Java 获取两个List的交集和差集,以及应用场景操作

作者:回归心灵  发布时间:2021-11-21 17:49:43 

标签: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

来源:https://blog.csdn.net/u010657094/article/details/78906641

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com