java取集合交集
一、交集
构造数据
private static void buildList() {
User u1 = new User("test1", 18);
User u2 = new User("test2", 19);
User u3 = new User("test3", 20);
User u4 = new User("test4", 21);
User u5 = new User("test5", 22);
list1.add(u1);
list1.add(u2);
list1.add(u3);
list2.add(u3);
list2.add(u4);
list2.add(u5);
System.out.println("集合1:" + list1);// 集合1:[User(name=test1, age=18), User(name=test2, age=19), User(name=test3, age=20)]
System.out.println("集合2:" + list2);// 集合2:[User(name=test3, age=20), User(name=test4, age=21), User(name=test5, age=22)]
}
数据如图:
注意:该数据中都有name为test3的用户,交集为User(name=test3, age=20)
- 方法一:使用java内置函数retainAll(Collection<?> c)
/**
* retainAll可以获取list1和list2的交集,但是会改变list1的数据
* 如果需要判断是否存在,需要判断移除后的list1是否还存在数据,不存在则说明两个不存在交集
*/
private static void method1(List<User> list1, List<User> list2) {
list1.retainAll(list2);
if (list1.size() > 0) {
System.out.println("存在交集为:" + list1);
} else {
System.out.println("不存在交集");
}
}
-
方法二: 遍历集合
/** * 遍历循环list1,如果list2中包含,则添加到新定义的集合中存储 */ private static void method2(List<User> list1, List<User> list2) { List<User> intersectionList = new ArrayList<>(); // 遍历list1 /* for (User user : list1) { if (list2.contains(user)) { intersectionList.add(user); } } */ // 流式遍历list1 list1.forEach(item -> { if (list2.contains(item)) { intersectionList.add(item); } }); if (intersectionList.size() > 0) { System.out.println("存在交集,交集为:" + intersectionList); } else { System.out.println("不存在交集"); } }
-
方法三:(map)大数据量下最高效
private static void method3(List<User> list1, List<User> list2) {
List<User> intersectionList = new ArrayList<>();
// 1、将list1存储在map中,key为name,value为User对象
Map<String, User> hashMap = list1.stream().collect(Collectors.toMap(User::getName, user -> user, (key1, key2) -> key2));
// 2、遍历list2,根据list1转换的map的key去获取值,存在则添加到集合中,
list2.forEach(item -> {
if (hashMap.get(item.getName()) != null) {
intersectionList.add(item);
}
});
if (intersectionList.size() > 0) {
System.out.println("存在交集,交集为:" + intersectionList);
} else {
System.out.println("不存在交集");
}
}
交集结果为: