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)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...
随机推荐
- Kaggle竞赛丨入门手写数字识别之KNN、CNN、降维
引言 这段时间来,看了西瓜书.蓝皮书,各种机器学习算法都有所了解,但在实践方面却缺乏相应的锻炼.于是我决定通过Kaggle这个平台来提升一下自己的应用能力,培养自己的数据分析能力. 我个人的计划是先从 ...
- Ubuntu18.04 安装配置mongodb
一.安装 # 1. 更新 sudo apt-get update # 2. 安装 sudo apt-get install -y mongodb # 3. 查看是否安装成功 # a. 服务状态 sud ...
- maven本地添加Oracle包
因为版权原因,Java后台连接数据库的ojdbc包并不可以用maven直接从网上下载导入,所以需要我们手动将其资源放在本地.下面是步骤: 1.找到Oracle ojdbc6包,拷贝到某备份目录2.包目 ...
- NIO&AIO编程模型
NIO线程模型 什么是NIO线程模型? 上图是NIO的线程模型, 基于select实现, 这种线程模型的特点: 多条channel通过一个选择器和单挑线程绑定, 并且在这种编程模型中, Cha ...
- IO系统-基本知识
注:本文档主要整理了Linux下IO系统的基本知识,是整理的网易云课堂的学习笔记,老师讲得很不错,链接如下:Linux IO系统 1.Linux操作系统的基本构成 内核:操作系统的核心,负责管理系统的 ...
- 大叔 Frameworks.Entity.Core 3 Predicate
Frameworks.Entity.Core\Commons\Predicate\ 1LinqEntity.cs /// IQueryable扩展方法:条件过滤与排序功能 /// Modify ...
- KALI美化-设置CONKY开机启动
简介 Conky 是一个应用于桌面环境的系统监视软件,可以在桌面上监控系统运行状态.网络状态等一系列参数 https://github.com/brndnmtthws/conky/ 详细配置文档:ht ...
- Java8 Stream用法详解
1.概述 Stream 的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选.去重.排序.聚合等.元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结 ...
- 贪心+huffman编码+模拟退火+分治(一)
(一)贪心 1.A - 今年暑假不AC “今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很 ...
- (.text+0x18): undefined reference to `main'
在将VS中的程序移植到ubuntu中出现的一个问题,主要原因是在vs中默认的主函数写成int _tmain(), 而在gcc编译时要找的是int main().改过来就可以了.