这篇文章运用简单易懂的例子给大家介绍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的交集和差集就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。