java实现交集,并集,包括对象和基本类型
//java实现求交集,并集,包括元素为对象和基本类型,主要是利用hashMap,set不允许元素重复等特性来进行实现去重,利用反射机制来灵活配置以对象某个属性来进行去重。
/**
* Gaoxl
* 求并集去重
* 基本类型和对象
* @param list1
* @param list2
* @param fieldName(用于去重的对象属性名)
* @return
*/
public static <T> List<T> getUnion(List<T> list1,List<T> list2,String fieldName) {
list1.addAll(list2);
if(null != fieldName){//对象
Map<Object,T> map = new HashMap<Object, T>();
List<T> list = new ArrayList<T>();
try{
PropertyDescriptor propertyDescription = new PropertyDescriptor(fieldName, list1.get(0).getClass());
Method readMethod = propertyDescription.getReadMethod();
for(T li : list1){//根据某属性值去重
Object fieldValue = readMethod.invoke(li);
map.put(fieldValue, li);
}
}catch(Exception e){
e.printStackTrace();
return null;
}
for(Object key : map.keySet()){
list.add(map.get(key));
}
return list;
}else{//基本类型
Set<T> set = new HashSet<>(list1);
return new ArrayList<T>(set);
}
} /**
* Gaoxl
* 求交集并去重
* 基本类型和对象
* @param list1
* @param list2
* @param fieldName(用于去重的对象属性名)
* @return
*/
public static <T> List<T> getIntersection(List<T> list1,List<T> list2,String fieldName){
List<T> result = new ArrayList<T>();
if(null != fieldName){
try{
Map<Object,T> map = new HashMap<Object, T>();
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fieldName, list1.get(0).getClass());
Method readMethod = propertyDescriptor.getReadMethod();
Map<Object,T> temp = new HashMap<Object, T>();
for(T li : list1){
map.put(readMethod.invoke(li), li);
}
for(T li : list2){
Object key = readMethod.invoke(li);
if(map.containsKey(key)){
temp.put(key, li);
}
}
for(Object key : temp.keySet()){
result.add(temp.get(key));
}
}catch(Exception e){
e.printStackTrace();
return null;
}
}else{
Set<T> set1 = new HashSet<>(list1);
Set<T> set2 = new HashSet<>(list2);
for(T li : set2){
if(set1.contains(li)){//求交集
result.add(li);
}
}
}
return result;
}
//User类
public class User{
private Long userId;
private String userName;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
} }
//测试类
public class testMethod {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("2");
List<String> list2 = new ArrayList<>();
list2.add("2");
list2.add("4");
list2.add("5");
//List<String> listResult = SysUtil.getUnion(list, list2, null);
//System.out.println(listResult); List<User> list3 = new ArrayList<>();
User user = new User();
user.setUserId(2L);
user.setUserName("admin");
list3.add(user);
User user1 = new User();
user1.setUserId(2L);
user1.setUserName("admin2");
list3.add(user1);
User user2 = new User();
user2.setUserId(3L);
user2.setUserName("admin3");
list3.add(user2); List<User> list4 = new ArrayList<>();
User user3 = new User();
user3.setUserId(4L);
user3.setUserName("admin2");
list4.add(user3); User user4 = new User();
user4.setUserId(6L);
user4.setUserName("admin4");
list4.add(user4); User user5 = new User();
user5.setUserId(5L);
user5.setUserName("admin5");
list4.add(user5); //List<User> list5 = SysUtil.getUnion(list3, list4, "userId");
//System.out.println(list5); List<String> list6 = SysUtil.getIntersection(list, list2, null);
System.out.println(list6); List<User> list7 = SysUtil.getIntersection(list3, list4, "userId");
System.out.println(list7);
}
}
java实现交集,并集,包括对象和基本类型的更多相关文章
- java list 交集 并集 差集 去重复并集
package com; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public clas ...
- java List交集 并集 差集 去重复并集
首先定义两个list List list1 =new ArrayList(); list1.add("); list1.add("); list1.add("); Lis ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- (java/javascript) list 交集 并集 差集 去重复并集
java list 交集 并集 差集 去重复并集 package com; import java.util.ArrayList; import java.util.Iterator; import ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
- java中的类和对象
Java中的类是一个模板,它用于描述一类对象的行为和状态. 对象则是类中的一个实例,对象有状态(属性)和行为(方法).例如一条狗就是一个对象,他的状态就是他的颜色,名字,品种:他的行为就是叫,摇尾巴, ...
- JAVA基础知识之IO——对象序列化
对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...
- Java反射获取类和对象信息全解析
反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...
- java基础面向对象之类与对象
java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...
随机推荐
- MySQL 行列相互转换
行列相互转换 /*创建表*/ CREATE TABLE ic ( NAME ), Product ), amount INT ); INSERT INTO ic VALUES (), (), (), ...
- 「雅礼集训 2017 Day2」棋盘游戏
祝各位圣诞后快乐(逃) 题目传送门 分析: 首先棋盘上的路径构成的图是一张二分图 那么对于一个二分图,先求出最大匹配,先手如果走到关键匹配点,只要后手顺着匹配边走,由于不再会出现增广路径,所以走到最后 ...
- allegro设置内存分配器的一个坑
看过<游戏引擎架构>后我开始对内存的分配问题关注,一直想用内存分配器来管理游戏的内存.前两天发现了有许多第三方内存分配器可以用.最后挑中了nedmalloc,这个库也是ogre所使用的,测 ...
- ASP.Net Core 发布到IIS Http Error 502.5 官方解决办法
Http Error 502.5 - Process Failure 在IIS上发布.NET Core程序出现这个错误.网上搜索到的办法为什么总行不通呢? 有可能年代久远,现在的环境与当年不同,所以解 ...
- 虚拟环境vitualenv的使用
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- CentOS7主机名的查看和修改
CentOS7主机名的查看和修改 在CentOS7中,有三种定义的主机名: 静态的(Static hostname) "静态"主机名也称为内核主机名,是系统在启动时从/etc/ho ...
- SpringCloud与微服务Ⅵ --- Ribbon负载均衡
一.Ribbon是什么 Sping Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户 ...
- hash模式与history模式
随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...
- Leetcode 题目整理
1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a ...
- BFS(广度优先搜索华容道游戏)--11--BFS--蓝桥杯卡片换位
题目描述 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | + ...