Java中两个List之间的比较(差集,交集,并集)

文章介绍了如何在Java中使用API和Java8新特性实现List的差集、交集和并集操作,包括去重和针对大数据量的优化方法。
摘要由CSDN通过智能技术生成

实现比较两个List之间的差异,包括获取两List的差集,交集,并集(不去重&去重)。

求差集
  /**
     *
     *  差集(基于API解法) 适用于小数据量
     *  求sourceList中有但targetList中没有的元素
     *  时间复杂度 O(sourceList.size() * targetList.size())
     *  typeConverter方法用于提取list中存储的对象的某个字段元素,并去重,而后将形成一个新的List集合
     */
public static <S,T,R> List<R> subList(List<S> sourceList, Function<S, R> sourceMapper,List<T> targetList,Function<T,R> targetMapper) {
        List<R> resultList = new ArrayList<>(typeConverter(sourceList, sourceMapper));
        resultList.removeAll(typeConverter(targetList,targetMapper));
        return resultList;
    }

public static <T, R> List<R> typeConverter(List<T> list, Function<T, R> mapper) {
        return list.stream().map(mapper).distinct().collect(Collectors.toList());
    }
    /**
     * 差集(基于java8新特性) 适用于大数据量
     * 求sourceList中有但targetList中没有的元素
     */
 public static <R> List<R> subList(List<R> sourceList,List<R> targetList){
       List<R> resultList = sourceList.stream().filter(e -> !targetList.contains(e)).collect(Collectors.toList());
       return resultList;
   }
求交集
    /**
     * 交集(基于API解法) 适用于小数据量
     * 求sourceList和targetList中都有的元素
     * 时间复杂度 O(sourceList.size() * targetList.size())
     */
    public static <R> List<R> intersectList(List<R> sourceList, List<R> targetList){
        List<R> resultList = new ArrayList<>(sourceList);
        resultList.retainAll(targetList);
        return resultList;
    }
   /**
     * 交集(基于java8新特性) 适用于大数据量
     * 求sourceList和targetList中都有的元素
     */
  public static <R> List<R> intersectList(List<R> sourceList,List<R> targetList){
        List<R> resultList = sourceList.stream().filter(targetList::contains).collect(Collectors.toList());
        return resultList;
    }
求并集(不去重)
  /**
     *  并集(不去重)
     *  合并sourceList和targetList不考虑去除重复元素
     *
     */
    public static <R> List<R> mergeList(List<R> sourceList,List<R> targetList){
        targetList.addAll(sourceList);
        return targetList;
    }
求并集(去重)
    /**
     *  并集(去重)
     *  合并sourceList和targetList并且去除重复元素
     *
     */
    public static <R> List<R> mergeList(List<R> sourceList,List<R> targetList){
        // 使用 HashSet 存储所有元素,自动去重
        Set<R> target = new HashSet<>(targetList);
        target.addAll(sourceList);
        List<R> resultList = new ArrayList<>(target);
        return resultList;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值