List集合去除复复元素记录

需求:

数据库中存在导入记录,新导入的数据只导入数据库中不存在的,对于存在的,直接忽略。

例如下面demo,

List<String>telephoneList存放的是从数据库查询出来的不重复的电话号码,

List<TrainPerson>trainPersonList存放的是即将要导入到数据库中的数据,由于trainPersonList中有的数据已存在数据库中(以电话号,telephone字段判断属性的唯一性)

通过泛型、反射,利用Set集合特性,对数据过滤的一个通用方法。


import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import cn.xdf.wlyy.domain.TrainPerson;


public class DataUtil<T> {

    /**
     * 去除重复记录
     * @param list 要去重的数据
     * @param idList 已存在的数据
     * @param methodStr 以T的哪个属性值做为重复数据的判断
     * @return
     * @throws Exception
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static <T>List<T> removeDBData(List<T> list, List<String> idList, String methodStr) throws Exception {
        if (idList != null && !idList.isEmpty()) {//说明之前存在导入记录
            List<T> tmpList = new ArrayList<T>();
            
            if (list != null && !list.isEmpty()) {
                //利用hashset特性,进行重复元素的过滤
                Set<String> idSet = new HashSet<String>();
                for (String id : idList) {
                    idSet.add(id);
                }
                
                for (T tmp : list) {
                    Class clazz = tmp.getClass();
                    Method method = clazz.getDeclaredMethod(methodStr);
                    String telephone = (String) method.invoke(tmp);
                    if (idSet.add(telephone)) {
                        tmpList.add(tmp);
                    }
                }
            }
            
            return tmpList;
        } else {//之前没有导入过记录
            //那么不用操作,list全部都是要导入的记录
            return list;
        }
    }
    
    public static void main(String[] args) {
        List<TrainPerson> trainPersonList = DataUtil.removeDBData(trainPersonList, telephoneList, "getTelephone");
    }
}

posted @ 2019-12-13 08:35  半湖思絮  阅读(75)  评论(0编辑  收藏  举报