List求交并集并去重

2 篇文章 0 订阅
1 篇文章 0 订阅

List求交并集并去重

直接看代码,主要用到了泛型,判断List反省中的东西是否相等,循环判断。

package com.sean.cloud.springcloud.test;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.*;

public class UnionUtil {

    /**
     * 求交集并去重
     * @param fieldName
     * @param lists
     * @param <T>
     * @return
     */
    public static <T> List<T> getIntersection(String fieldName,List<T>... lists){
        List<T> result = new ArrayList<T>();
        if(null != fieldName){
            try{
                Map<Object,T> map = new HashMap<Object, T>();
                for (int i = 0; i < lists.length-1; i++) {
                    PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fieldName, lists[i].get(0).getClass());
                    Method readMethod = propertyDescriptor.getReadMethod();
                    Map<Object, T> temp = new HashMap<Object, T>();
                    for (T li : lists[i]) {
                        map.put(readMethod.invoke(li), li);
                    }
                    for (T li : lists[i+1]) {
                        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{
            for (int i = 0; i < lists.length-1; i++) {
                Set<T> set1 = new HashSet<>(lists[i]);
                Set<T> set2 = new HashSet<>(lists[i+1]);
                for(T li : set2){
                    if(set1.contains(li)){//求交集
                        Set<T> set3 = new HashSet<>(result);
                        if(!result.contains(li)){
                            result.add(li);
                        }
                    }
                }
            }
        }
        return result;
    }

    /**
     * 求并集去重
     * @param list1
     * @param list2
     * @param fieldName
     * @param <T>
     * @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);
        }
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值