//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);
}
}
原文:https://www.cnblogs.com/lin0/p/11941827.html