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)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...
随机推荐
- 01-web自动化基础篇
1.搭建环境 需要的环境 浏览器(Firefox/Chrome/IE…)-----选择Chrome Python Selenium Selenium IDE(如果用Firefox) FireBug.F ...
- mysql 自增
auto_increment 在创建表的时候,可以设置id为自增 # 查看表现在的自增值 show create table blog \G; # 设置自增值的初始值 alter table blog ...
- 跨源请求cors和jsonp
0.产生跨域的原因 浏览器的同源策略 什么是浏览器的同源策略? src开发 ajax禁止 解决方法 jsonp 通过src绕过浏览器的同源策略 缺点:只发送GET请求 cors 通过设置相应头 分类 ...
- Django SQLite3的使用
https://blog.csdn.net/qq_34485436/article/details/72805908
- 【java面试】线程篇
1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位. 2.线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任 ...
- 软工造梦厂团队项目(Alpha版本发布2)
课程 (https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience) 作业要求 https://www.cnblogs.com/h ...
- c#数字图像处理(六)直方图均衡化
直方图均衡化又称直方图修平,是一种很重要的非线性点运算.使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好的在直方图上分布. 直方图均衡化的基 ...
- ShiroINI配置及加密(三)
Shiro InI 配置 ini语法: 1.对象名 = 全限定类名 相对于调用 public 无参构造器创建对象 2.对象名. 属性名 = 值 相当于调用 setter 方法设置常量值 3.对象名. ...
- Oracle:imp导入dmp文件
oracle命令行登录 sqlplus / as sysdba 创建用户 create user 用户 identified by 密码 ; 创建表空间 create tablespace 表空间名 ...
- BP的matlab实现
%2015.04.26 Kang Yongxin ----v 2.0 %完成作业中BP算法,采用批量方式更新权重 %% %输入数据格式 %x 矩阵 : 样本个数*特征维度 %y 矩阵 :样本个数*类别 ...