//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实现交集,并集,包括对象和基本类型的更多相关文章

  1. java list 交集 并集 差集 去重复并集

    package com; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public clas ...

  2. java List交集 并集 差集 去重复并集

    首先定义两个list List list1 =new ArrayList(); list1.add("); list1.add("); list1.add("); Lis ...

  3. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  4. (java/javascript) list 交集 并集 差集 去重复并集

    java list 交集 并集 差集 去重复并集 package com; import java.util.ArrayList; import java.util.Iterator; import ...

  5. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  6. java中的类和对象

    Java中的类是一个模板,它用于描述一类对象的行为和状态. 对象则是类中的一个实例,对象有状态(属性)和行为(方法).例如一条狗就是一个对象,他的状态就是他的颜色,名字,品种:他的行为就是叫,摇尾巴, ...

  7. JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  8. Java反射获取类和对象信息全解析

    反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...

  9. java基础面向对象之类与对象

    java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...

随机推荐

  1. C#与JavaScript中URL编码解码问题(转)

    混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Serv ...

  2. [bzoj4823][洛谷P3756][Cqoi2017]老C的方块

    Description 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上 ,如果两个小方格有公共的边,就称它们是相邻的, ...

  3. python练习-8.12

    注:本代码是<python核心编程(第二版)>的第八章8-12的练习题的代码实现. 完成的功能:用户给出起始和结束的数字后给出一个下面的表格,分别显示出两个数字间所有整型的十进制.二进制. ...

  4. 编译游戏库allegro

    一个allegro依赖了大概十个库,还得自己一个个的去编译,然后复制粘贴 主要从两个网页学到的 第一个网页里有绝大多数的依赖库的编译方法 http://wiki.allegro.cc/index.ph ...

  5. 爬虫之 App 爬取

    - 移动端数据的爬取- 抓包工具: - fiddler - 青花瓷 - miteproxy - 环境的搭建 1.对fiddler进行配置:tools->options->connectio ...

  6. jdk for centos7

    https://www.cnblogs.com/chy123/p/6750351.html

  7. 数据结构与算法 --- js描述集合

    js描述集合 function Set(){ this.datasource=[]; this.add=add; this.remove=remove; //this.size=size; //thi ...

  8. yield 伪并发例子

    import timedef custumer(name): print('%s 准备吃饺子了'%name) while True: curry = yield print('饺子%s来了 ,被%s吃 ...

  9. MYSQL-innobackupex备份脚本

    自动化运维,是数据库管理员的不懈追求.目前出现了一些数据库自动管理平台,但出现时间较短,不够稳定.最常用的工具依然是shell脚本. 现在需要管理的某mysql数据库,数据量在800G,使用dump备 ...

  10. Educational Codeforces Round 80 (Rated for Div. 2)部分题解

    A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...