java list 交集_java两个List的交集,并集
文章来源:https://www.cnblogs.com/qdhxhz/p/10787130.html
非对象集合交、并、差处理
方法一:使用apache的CollectionUtils工具类(推荐)
public static void main(String[] args) {
String[] arrayA = new String[] { "1", "2", "3", "4"};
String[] arrayB = new String[] { "3", "4", "5", "6" };
List listA = Arrays.asList(arrayA);
List listB = Arrays.asList(arrayB);
//1、并集 union
System.out.println(CollectionUtils.union(listA, listB));
//输出: [1, 2, 3, 4, 5, 6]
//2、交集 intersection
System.out.println(CollectionUtils.intersection(listA, listB));
//输出:[3, 4]
//3、交集的补集(析取)disjunction
System.out.println(CollectionUtils.disjunction(listA, listB));
//输出:[1, 2, 5, 6]
//4、差集(扣除)
System.out.println(CollectionUtils.subtract(listA, listB));
//输出:[1, 2]
}
方法二:List自带方法
public static void main(String[] args) {
String[] arrayA = new String[] { "1", "2", "3", "4"};
String[] arrayB = new String[] { "3", "4", "5", "6" };
List listA = Arrays.asList(arrayA);
List listB = Arrays.asList(arrayB);
//1、交集
List jiaoList = new ArrayList<>(listA);
jiaoList.retainAll(listB);
System.out.println(jiaoList);
//输出:[3, 4]
//2、差集
List chaList = new ArrayList<>(listA);
chaList.removeAll(listB);
System.out.println(chaList);
//输出:[1, 2]
//3、并集 (先做差集再做添加所有)
List bingList = new ArrayList<>(listA);
bingList.removeAll(listB); // bingList为 [1, 2]
bingList.addAll(listB); //添加[3,4,5,6]
System.out.println(bingList);
//输出:[1, 2, 3, 4, 5, 6]
}
注意 : intersection和retainAll的差别
要注意的是它们的返回类型是不一样的,intersection返回的是一个新的List集合,而retainAll返回是Bollean类型那就说明retainAll方法是对原有集合进行处理再返回原有集合,会改变原有集合中的内容。
个人观点:1、从性能角度来考虑的话,List自带会高点,因为它不用再创建新的集合。2、需要注意的是:因为retainAll因为会改变原有集合,所以该集合需要多次使用就不适合用retainAll。
注意: Arrays.asList将数组转集合不能进行add和remove操作。
原因:调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的市Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。
所以正确做法如下
String[] array = {"1","2","3","4","5"};
List list = Arrays.asList(array);
List arrList = new ArrayList(list);
arrList.add("6");
方法三:JDK1.8 stream 新特性
String[] arrayA = new String[] { "1", "2", "3", "4"};
String[] arrayB = new String[] { "3", "4", "5", "6" };
List listA = Arrays.asList(arrayA);
List listB = Arrays.asList(arrayB);
// 交集
List intersection = listA.stream().filter(item -> listB.contains(item)).collect(toList());
System.out.println(intersection);
//输出:[3, 4]
// 差集 (list1 - list2)
List reduceList = listA.stream().filter(item -> !listB.contains(item)).collect(toList());
System.out.println(reduceList);
//输出:[1, 2]
// 并集 (新建集合:1、是因为不影响原始集合。2、Arrays.asList不能add和remove操作。
List listAll = listA.parallelStream().collect(toList());
List listAll2 = listB.parallelStream().collect(toList());
listAll.addAll(listAll2);
System.out.println(listAll);
//输出:[1, 2, 3, 4, 3, 4, 5, 6]
// 去重并集
List list =new ArrayList<>(listA);
list.addAll(listB);
List listAllDistinct = list.stream().distinct().collect(toList());
System.out.println(listAllDistinct);
//输出:[1, 2, 3, 4, 5, 6]
总结 : 这三种推荐第一种方式,因为第二种还需要确定该集合是否被多次调用。第三种可读性不高。
对象集合交、并、差处理
因为对象的equels比较是比较两个对象的内存地址,所以除非是同一对象,否则equel返回永远是false。
但我们实际开发中 在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了,所以这个时候我们需要重写equals方法。
说明 :String为什么可以使用equels方法为什么只要字符串相等就为true,那是因为String类重写了equal和hashCode方法,比较的是值。
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
/**
* 为什么重写equals方法一定要重写hashCode方法下面也会讲
*/
@Override
public int hashCode() {
String result = name + age;
return result.hashCode();
}
/**
* 重写 equals 方法 根据name和age都相同那么对象就默认相同
*/
@Override
public boolean equals(Object obj) {
Person u = (Person) obj;
return this.getName().equals(u.getName()) && (this.age.equals(u.getAge()));
}
/**
* 重写 toString 方法
*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
这里根据name和age都相同那么就默认相同对象。
public static void main(String[] args) {
List personList = Lists.newArrayList();
Person person1 = new Person("小小",3);
Person person2 = new Person("中中",4);
personList.add(person1);
personList.add(person2);
List person1List = Lists.newArrayList();
Person person3 = new Person("中中",4);
Person person4 = new Person("大大",5);
person1List.add(person3);
person1List.add(person4);
/**
* 1、差集
*/
System.out.println(CollectionUtils.subtract(personList, person1List));
//输出:[Person{name='小小', age=3}]
/**
* 2、并集
*/
System.out.println(CollectionUtils.union(personList, person1List));
//输出:[Person{name='小小', age=3}, Person{name='中中', age=4}, Person{name='大大', age=5}]
/**
* 3、交集
*/
System.out.println(CollectionUtils.intersection(personList, person1List));
//输出:[Person{name='中中', age=4}]
/**
* 4、交集的补集(析取)
*/
System.out.println(CollectionUtils.disjunction(personList, person1List));
//输出:[Person{name='小小', age=3}, Person{name='大大', age=5}]
}
转载于:https://www.cnblogs.com/ooo0/p/13091760.html
java list 交集_java两个List的交集,并集相关推荐
- java集合操作-----求两个集合的交集和并集
java求两个集合的交集和并集 java如何求两个集合的交集和并集呢??其实java的API中已经封装了方法.今天写个简单的例子测试一下:(例子中以java.util.LinkedList为例) 求连 ...
- java 时间段求并集,java集合操作-----求两个集合的交集和并集
2019独角兽企业重金招聘Python工程师标准>>> java求两个集合的交集和并集 java如何求两个集合的交集和并集呢??其实java的API中已经封装了方法.今天写个简单的例 ...
- java的比较器_java两种比较器总结
[Comparable和Comparator源码] java.lang.Comparablepublic interface Comparable{public intcomparaTo(T o); ...
- java 方法互斥_Java 两个互斥方法同时访问一个成员变量
publicclassTTimplementsRunnable{intb=100;//b是公共资源publicsynchronizedvoidm1()throwsException{b=1000;Th ...
- java同名类_java两个不同名类 在里面建立两个同名的类 怎么破
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 package oneTest; public class Teacher { String teacherName ;//姓名 String teach ...
- php 两个数组 交集_两个数组的交集
给定两个数组,编写一个函数来计算它们的交集. 示例1: 输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2] 示例2: 输入:nums1 = [4,9,5], num ...
- java集合交运算_java中计算集合的交差并集示例代码
前言 本文主要给大家简单介绍下,如何使用apache commons以及guava的类库来计算集合的交差并集.分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. maven com.go ...
- java两map取交集_Java Map 求交集 并集 差集
import com.google.common.collect.MapDifference; import com.google.common.collect.Maps; import java.u ...
- Java教程交集_Java 程序计算两个集合的交集
Java 程序计算两个集合的交集 在此示例中,我们将学习计算Java中两个集合的交集. 要理解此示例,您应该了解以下Java编程主题: 示例1:计算两个集合的交集 示例import java.util ...
最新文章
- Spring中SmartLifecycle和Lifecycle的作用和区别
- Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
- 设计模式(二)————观察者模式
- Angular应用的依赖注入调试
- BC div2补题以及 复习模除 逆元__BestCoder Round #78 (div.2)
- 前端学习(586):在元素中动态添加类与伪类
- 【汉化】DevExpress插件中RichEdit控件的自定义汉化方法
- python elementtree 命名空间_用Python中的命名空间通过‘ElementTree’解析XML
- 概率论与数理统计——贝塞尔校正(Bessel‘s Correction)
- 计算机接口技术 实验箱,微机原理及接口技术实验箱.doc
- centos8安装ss发生错误failed to install pthon
- Android 微信、QQ、微博分享问题汇总
- php多合一安装包,DOXCX多合一小程序系统Sass平台源码分享
- android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解
- excel按某个字符将一个单元格拆分成多个单元格
- 刷单会入刑了你知道吗?四招教你迅速识别刷单!
- js几行代码搞定html转图片制作海报,html2canvas应用实例
- Java匹马行天下之教你用学汉语式方法学编程语言
- 图形学笔记(十八)光场、颜色和感知—— 光场相机(全光函数、光线和光场的定义)、可见光谱、谱功率密度、颜色的生物学基础、Tristimulus Theory、同色异谱、加色与减色系统、颜色空间SPD
- 【MySQL数据库】一约束
热门文章
- 如何使用JavaScript控制台:超越console.log()
- springMVC导出 CSV案例
- css 百分比 怎么固定正方形_web前端入门到实战:一次搞懂CSS字体单位:px、em、rem和%
- 学生_课程_成绩_教师50个常用sql
- kali修改root密码
- Flask框架——请求钩子与request请求对象
- 【CCF】201709-1打酱油
- 微软为何选择在 Github 上开源 .NET 核心?
- 服务器IIS asp.net中.aspx映射
- 常用 AT 命令手册