关键字

代码、代码片段、集合、交集、差集、补集

场景

很多人写Java代码时,都比较喜欢用List集合,而不是用Set集合,虽然应该Set集合的不重复特性更符合他的业务场景。虽然教科书式的Java教程叫我们重写equals、hashCode方法,但实际上有些人却不想这么干。

下面的代码片段,特点在于使用自定义的java.util.function.BiPredicate(jdk8+才有这个类)接口来为两个java.util.List计算交集、补集(差集)。BiPredicate接口可以自己实现test方法逻辑,返回boolean,以判定List中的元素是否相同。

上代码

 /*** 取{@code firstList}参数与{@code secondList}参数的交集** <p>通过传入{@link BiPredicate}接口的实现,自定义判断 {@code firstList}与{@code secondList}的哪些元素相同。* 效果类似于实现了{@code T}的{@code equals}方法,但此方法的优点是不要求你这么做,可以让你通过{@link BiPredicate}接口无侵入式的自定义{@code equals}逻辑。</p>* <p>假设{@code firstList}中的元素为[1,2,3],{@code secondList}中的元素为[2,3,4],则返回{@code firstList}中的[2,3]</p>** @param firstList 第一个集合* @param secondList 第二个集合* @param equalPredicate 判断两个元素是否相同* @return 返回 {@link ArrayList}实例,其中的元素是{@code firstList}参数与{@code secondList}的交集。注意,{@link ArrayList}实例中的元素引用来源于{@code firstList}而不是{@code secondList}* @throws NullPointerException 如果<code>firstList</code>、<code>secondList</code>、<code>equalPredicate</code>参数为null* @author laozhu*/public  static <T> ArrayList<T> retain(List<T> firstList, List<T> secondList, BiPredicate<T,T> equalPredicate){Objects.requireNonNull(firstList);Objects.requireNonNull(secondList);Objects.requireNonNull(equalPredicate);ArrayList<T> resultList = new ArrayList<>();for(int i = 0; i < firstList.size();  i++){for(int j = 0; j < secondList.size();  j++){if(equalPredicate.test(firstList.get(i),secondList.get(j))){//相同元素resultList.add(firstList.get(i));//break能够防止secondList中有重复的元素,导致resultList中添加了两个相同的firstList中的元素break;}}}return resultList;}/*** 取{@code firstList}参数与{@code secondList}的补集(又叫差集)** <p>通过传入{@link BiPredicate}接口的实现,自定义判断 {@code firstList}与{@code secondList}的哪些元素相同。* 效果类似于实现了{@code T}的{@code equals}方法,但此方法的优点是不要求你这么做,可以让你通过{@link BiPredicate}接口无侵入式的自定义{@code equals}逻辑。</p>* <p>假设{@code firstList}中的元素为[1,2,3],{@code secondList}中的元素为[2,3,4],则返回{@code firstList}中的[1]</p>** @param firstList 第一个集合* @param secondList 第二个集合* @param equalPredicate 判断两个元素是否相同* @return 返回 {@link ArrayList}实例,其中的元素是{@code firstList}参数与{@code secondList}的补集(又叫差集)。注意,{@link ArrayList}实例中的元素引用来源于{@code firstList}而不是{@code secondList}* @throws NullPointerException 如果<code>firstList</code>、<code>secondList</code>、<code>equalPredicate</code>参数为null* @author laozhu*/public  static <T> List<T>  diff(List<T> firstList, List<T> secondList, BiPredicate<T,T> equalPredicate){Objects.requireNonNull(firstList);Objects.requireNonNull(secondList);Objects.requireNonNull(equalPredicate);ArrayList<T> resultList = new ArrayList<>();for(int i = 0; i < firstList.size();  i++){boolean hasEqualElementInSecondList = false;for(int j = 0; j < secondList.size();  j++){if(equalPredicate.test(firstList.get(i),secondList.get(j))){//相同元素hasEqualElementInSecondList = true;break;}}if(!hasEqualElementInSecondList){resultList.add(firstList.get(i));}}return resultList;}

调用示例

交集

代码:

public class HelloWorld {public static void main(String[] args) {Student s1 = new Student("100","zhangsan");Student s2 = new Student("101","zhangsan");Student s3 = new Student("102","zhangsan");Student s4 = new Student("103","zhangsan");List<Student> list1 = Arrays.asList(s1,s2);List<Student> list2 = Arrays.asList(s2,s3,s4);List result = SetUtil.retain(list1,list2,(a,b)->a.getSid().equals(b.getSid()));System.out.println("交集:");System.out.println(result);}}

打印结果:

交集:
[Student{sid='101', name='zhangsan'}]

补集(差集)

代码:

public class HelloWorld {public static void main(String[] args) {Student s1 = new Student("100","zhangsan");Student s2 = new Student("101","zhangsan");Student s3 = new Student("102","zhangsan");Student s4 = new Student("103","zhangsan");List<Student> list1 = Arrays.asList(s1,s2);List<Student> list2 = Arrays.asList(s2,s3,s4);List result = SetUtil.diff(list1,list2,(a,b)->a.getSid().equals(b.getSid()));System.out.println("补集(差集):");System.out.println(result);}}

打印结果:

补集(差集):
[Student{sid='100', name='zhangsan'}]

Java代码-List集合求交集、补集(差集)相关推荐

  1. Python - 集合的交集补集差集并集全集

    一.定义: set是一个无序且不重复的元素集合. demo1 = set([1,2,3]) demo2 = set([3,4]) demo3 = set([4]) print(demo1 & ...

  2. java求集合的交集、差集和并集

    一.本文介绍两种写法 1原生写法 2com.google.guava写法 <dependency>     <groupId>com.google.guava</grou ...

  3. JAVA Hashset求集合的交集并集差集

    JAVA Hashset求集合的交集并集差集 Hashset是Set接口较为常见的一个子类,该子类的最大特点是不允许保存重复的元素,并且所有的内容都采用散列(无序)的方式进行存储. package c ...

  4. java中set集合的交集、并集、差集

    java中set集合的交集.并集.差集 集合关系示例图 示例代码 public static void contextLoads() {List<String> a= Arrays.asL ...

  5. java 交集_Java大集合求交集的方法比较

    两个List集合求交集想必学过Java的都知道用系统自带的retainAll()方法,但是在数据量比较大时,这个方法效率并不高,利用空余时间研究了几种数据量较大时求两个集合交集的办法.本文主要研究了J ...

  6. oracle 并集 时间_Oracle集合运算符 交集 并集 差集

    集合运算符:UNION/UNION ALL 并集,INTERSECT 交集,MINUS 差集 一.union求并集,公共部分只有包含一次 例:求emp表ename中含'A'或含有'M' SQL> ...

  7. php 队列取并集,PHP实现对数组简单求交集,差集,并集功能示例

    php 的 PHP实现对数组简单求交集,差集,并集功能示例 本文实例讲述了PHP实现对数组简单求交集,差集,并集功能.分享给大家供大家参考,具体如下: $arr1 = array( '0' => ...

  8. MySQL求交集 并集 差集

    MySQL求交集 并集 差集 交集 两个表之间相同的 并集 两个表之间的总和 ps: union 自带去重 差集 两个表直接的差值

  9. php 两个数组求交集_PHP实现对数组简单求交集,差集,并集功能示例

    本文实例讲述了PHP实现对数组简单求交集,差集,并集功能.分享给大家供大家参考,具体如下: $arr1 = array( '0' => 'zero', '1' => 'one', '2' ...

  10. sort求交集并集差集

    uniq -u    取出只出现过一次的元素,用来求差集 uniq -c     group by uniq -d     取出出现次数大于等于2的元素,用来求交集 sort 1 2 和cat 1 2 ...

最新文章

  1. 自定义能够for each的类,C#,Java,C++,C++/cli的实现方法
  2. java类构造方法成员方法练习_面向对象方法论总结 练习(一)
  3. Android IT资讯网络阅读器应用源码
  4. 叫板 Android 开发!跨平台应用开发神器 Flutter 又添开源插件!| 技术头条
  5. java比较炫的小程序_有人不建议学Java,有人不建议学Python,该怎么选择
  6. 向架构师进军---系统架构设计基础知识
  7. latex 调整表格的行高_latex 表格如何控制行高,行距,行与行之间的距离
  8. html代码大全右对齐,html特效代码大全
  9. Coursera视频无法播放问题解决
  10. 使用jq来封装一个瀑布流插件
  11. Idea、pycharm、Phpstorm鼠标滑动设置字体大小方法
  12. 南充十中高考2021成绩查询,2021年南充十中招办电话是多少?
  13. 一、数据库之理论基础
  14. html实现点击出现小爱心
  15. 北邮计院数电第五章——VHDL语言
  16. KVM虚拟化使用详解--技术流ken
  17. 电子版药丸,监控你的健康
  18. 刷脸支付有助商户自主营销计划节省开支
  19. Linux系统管理及服务配置
  20. PAT:银行排队问题:队列

热门文章

  1. 无源贴片晶振四角引脚_晶振厂家告诉你贴片晶振的脚位方向如何区分 - 中山惠源晶工...
  2. 【SQL注入技巧拓展】————14、Bypass 360主机卫士SQL注入防御(附tamper脚本)
  3. android 原笔迹,Android-原笔迹手写的探索与开发
  4. 小谈 《日内交易策略--谷物期货交易实战指南》中提到的策略
  5. 二十多年了,安全套市场还只有杜蕾斯、冈本、杰士邦
  6. 使用bibmap修改bib文件中参考文献的期刊或会议名的字母大小写格式为titlecase
  7. 手机b站封面提取网站_B站视频封面提取网站
  8. 计算机温度压力测试,整机性能与温度压力测试
  9. 日志追踪-Java字节码-类文件结构
  10. Redis深度历险——原理与集群篇