对比两个实体类不同

//比较两个实体,返回两个Map结果
    public static void compare(String tableId, Object source, Object target, Map sourceMap, Map targetMap) {
        sourceMap.putAll((Map) BeanMapPlus(BeanUtil.beanToMap(source)));
        targetMap.putAll((Map) BeanMapPlus(BeanUtil.beanToMap(target)));
        delIntersection(tableId, sourceMap, targetMap);
    }

    ;
    //beantoMap加强,完全Map化 
    private static Object BeanMapPlus(Object map) {
        if (map instanceof Map) {
            HashSet<Object> set = new HashSet<>();
            set.addAll(((Map) map).keySet());
            for (Object o : set) {
                if (ObjectUtils.isEmpty(((Map) map).get(o))) {((Map<?, ?>) map).remove(o);continue; }
                if (BeanUtil.isBean(((Map) map).get(o).getClass()) && !(((Map) map).get(o) instanceof Date)) {
                    ((Map) map).put(o, BeanMapPlus(BeanUtil.beanToMap(((Map) map).get(o))));
                }
                if (((Map) map).get(o) instanceof Collection) BeanMapPlus(((Collection<?>) ((Map) map).get(o)));
            }
        }
        else if (map instanceof Collection && !ObjectUtils.isEmpty(map)) {
            List list = new ArrayList<>();
            for (Object o : ((Collection<?>) map)) {
                list.add(BeanMapPlus(BeanUtil.beanToMap(o)));
            }
            ((Collection<?>) map).clear();
            ((Collection<?>) map).addAll(list);
        }
        return map;
    }
   //删除两个Map的键值对交集
    private static void delIntersection(String tableId, Map sourceMap, Map targetMap) {
        HashSet<Object> set = new HashSet<>();
        set.addAll(sourceMap.keySet());
        for (Object o : set) {
            if (!targetMap.containsKey(o)) continue;
            if (targetMap.get(o) instanceof Map && sourceMap.get(o) instanceof Map)
                delIntersection(tableId, (Map) sourceMap.get(o), (Map) targetMap.get(o));
            if (targetMap.get(o) instanceof Collection && sourceMap.get(o) instanceof Collection) {
                if (((Collection<?>) targetMap.get(o)).containsAll(((Collection<?>) sourceMap.get(o)))) {
                    targetMap.remove(o);
                    sourceMap.remove(o);
                    continue;
                }
                //按数组顺序比较
                ArrayList<Object> soruce = new ArrayList<>();
                soruce.addAll(((Collection<?>) sourceMap.get(o)));
                ArrayList<Object> target = new ArrayList<>();
                target.addAll(((Collection<?>) targetMap.get(o)));
                for (int i = 0; i < Math.min(soruce.size(),target.size()); i++) {
                    if(soruce.get(i) instanceof Map && target.get(i) instanceof Map) delIntersection(tableId,(Map) soruce.get(i),(Map)target.get(i));
                }
//                //按 tableId 比较
//                List list = new ArrayList();
//                for (Object o1 : ((Collection<?>) targetMap.get(o))) {
//                    for (Object o2 : ((Collection<?>) sourceMap.get(o))) {
//                        if (o1 == o2) list.add(o1);
//                        else if (o1 instanceof Map
//                                && o2 instanceof Map
//                                && ((Map) o1).containsKey(tableId)
//                                && ((Map) o2).containsKey(tableId)
//                                && ((Map) o1).get(tableId) == ((Map) o2).get(tableId)
//                        ) delIntersection(tableId, ((Map) o1), ((Map) o2));
//                    }
//                }
//                if (!ObjectUtils.isEmpty(list)) {
//                    ((Collection<?>) targetMap.get(o)).removeAll(list);
//                    ((Collection<?>) sourceMap.get(o)).removeAll(list);
//                }
            }
            if (targetMap.get(o).getClass() != sourceMap.get(o).getClass()) continue;
            if (targetMap.get(o).toString().equals(sourceMap.get(o).toString())) {
                targetMap.remove(o);
                sourceMap.remove(o);
                continue;
            }
        }
    }

注:

BeanMapPlus这个方法目前只排除了Date类型,如果由其他需要排除的属性类型,可以再调整;
优化版本:
    public static void compare(String tableId, Object source, Object target, Map sourceMap, Map targetMap,List<String> ignores) {
        sourceMap.putAll((Map) BeanMapPlus(BeanUtil.beanToMap(source),ignores));
        targetMap.putAll((Map) BeanMapPlus(BeanUtil.beanToMap(target),ignores));
        delIntersection(tableId, sourceMap, targetMap,ignores);
    }

    ;

    private static Object BeanMapPlus(Object map,List<String> ignores) {
        if (map instanceof Map) {
            HashSet<Object> set = new HashSet<>();
            set.addAll(((Map) map).keySet());
            for (Object o : set) {
                if(!ObjectUtils.isEmpty(ignores) && ignores.contains(o.toString())) {
                    ((Map<?, ?>) map).remove(o);
                    continue;
                }
                if (ObjectUtils.isEmpty(((Map) map).get(o))) {((Map<?, ?>) map).remove(o);continue; }
                if (BeanUtil.isBean(((Map) map).get(o).getClass()) && !(((Map) map).get(o) instanceof Date)) {
                    ((Map) map).put(o, BeanMapPlus(BeanUtil.beanToMap(((Map) map).get(o)),ignores));
                }
                if (((Map) map).get(o) instanceof Collection) BeanMapPlus(((Collection<?>) ((Map) map).get(o)),ignores);
            }
        }
        else if (map instanceof Collection && !ObjectUtils.isEmpty(map)) {
            List list = new ArrayList<>();
            for (Object o : ((Collection<?>) map)) {
                list.add(BeanMapPlus(BeanUtil.beanToMap(o),ignores));
            }
            ((Collection<?>) map).clear();
            ((Collection<?>) map).addAll(list);
        }
        return map;
    }

    private static void delIntersection(String tableId, Map sourceMap, Map targetMap,List<String> ignores) {
        HashSet<Object> set = new HashSet<>();
        set.addAll(sourceMap.keySet());
        for (Object o : set) {
            if(!ObjectUtils.isEmpty(ignores) && ignores.contains(o.toString())) {
                targetMap.remove(o);
                sourceMap.remove(o);
                continue;
            }
            if (!targetMap.containsKey(o)) continue;
            if (targetMap.get(o) instanceof Map && sourceMap.get(o) instanceof Map) {
                delIntersection(tableId, (Map) sourceMap.get(o), (Map) targetMap.get(o),ignores);
                if(ObjectUtils.isEmpty(targetMap.get(o)) && ObjectUtils.isEmpty(sourceMap.get(o))) {
                    targetMap.remove(o);
                    sourceMap.remove(o);
                }
            }
            if (targetMap.get(o) instanceof Collection && sourceMap.get(o) instanceof Collection) {
//                if (((Collection<?>) targetMap.get(o)).containsAll(((Collection<?>) sourceMap.get(o)))) {
//                    ((Collection<?>) targetMap.get(o)).removeAll(((Collection<?>) sourceMap.get(o)));
//                    ((Collection<?>) sourceMap.get(o)).removeAll(((Collection<?>) sourceMap.get(o)));
//                    if(ObjectUtils.isEmpty(targetMap.get(o)) && ObjectUtils.isEmpty(targetMap.get(o))) {
//                        targetMap.remove(o);
//                        sourceMap.remove(o);
//                    }
//                    continue;
//                }
//                if (((Collection<?>) sourceMap.get(o)).containsAll(((Collection<?>) targetMap.get(o)))) {
//                    ((Collection<?>) sourceMap.get(o)).removeAll(((Collection<?>) targetMap.get(o)));
//                    ((Collection<?>) targetMap.get(o)).removeAll(((Collection<?>) targetMap.get(o)));
//                    if(ObjectUtils.isEmpty(sourceMap.get(o))) {
//                        sourceMap.remove(o);
//                        targetMap.remove(o);
//                    }
//                    continue;
//                }
                //遍历比较
                List<Object> ol = new ArrayList<>();
                for (Object o1 : ((Collection<?>) targetMap.get(o))) {
                    for (Object o2 : ((Collection<?>) sourceMap.get(o))) {
                        if(o1.getClass() != o2.getClass()) continue;
                        if(o1 instanceof Map && o2 instanceof Map) delIntersection(tableId,(Map) o1,(Map)o2,ignores);
                        if(ObjectUtils.isEmpty(o1)) ol.add(o1);
                        if(ObjectUtils.isEmpty(o2)) ol.add(o2);
                        if(o1.toString().equals(o2.toString())) ol.add(o1);
                    }
                }
                ((Collection<?>) targetMap.get(o)).removeAll(ol);
                ((Collection<?>) sourceMap.get(o)).removeAll(ol);
                if(ObjectUtils.isEmpty(targetMap.get(o)) && ObjectUtils.isEmpty(sourceMap.get(o))) {
                    targetMap.remove(o);
                    sourceMap.remove(o);
                }
//                //按数组顺序比较
//                ArrayList<Object> soruce = new ArrayList<>();
//                soruce.addAll(((Collection<?>) sourceMap.get(o)));
//                ArrayList<Object> target = new ArrayList<>();
//                target.addAll(((Collection<?>) targetMap.get(o)));
//                for (int i = 0; i < Math.min(soruce.size(),target.size()); i++) {
//                    if(soruce.get(i) instanceof Map && target.get(i) instanceof Map) delIntersection(tableId,(Map) soruce.get(i),(Map)target.get(i),ignores);
//                }
//                //按 tableId 比较
//                List list = new ArrayList();
//                for (Object o1 : ((Collection<?>) targetMap.get(o))) {
//                    for (Object o2 : ((Collection<?>) sourceMap.get(o))) {
//                        if (o1 == o2) list.add(o1);
//                        else if (o1 instanceof Map
//                                && o2 instanceof Map
//                                && ((Map) o1).containsKey(tableId)
//                                && ((Map) o2).containsKey(tableId)
//                                && ((Map) o1).get(tableId) == ((Map) o2).get(tableId)
//                        ) delIntersection(tableId, ((Map) o1), ((Map) o2));
//                    }
//                }
//                if (!ObjectUtils.isEmpty(list)) {
//                    ((Collection<?>) targetMap.get(o)).removeAll(list);
//                    ((Collection<?>) sourceMap.get(o)).removeAll(list);
//                }
            }
//            if(ObjectUtils.isEmpty(targetMap.get(o))) targetMap.remove(o);
//            if(ObjectUtils.isEmpty(sourceMap.get(o))) sourceMap.remove(o);
            if(ObjectUtils.isEmpty(targetMap.get(o)) || ObjectUtils.isEmpty(sourceMap.get(o))) continue;
            if (targetMap.get(o).getClass() != sourceMap.get(o).getClass()) continue;
            if (targetMap.get(o).toString().equals(sourceMap.get(o).toString())) {
                targetMap.remove(o);
                sourceMap.remove(o);
                continue;
            }
        }
    }

 

 

posted on 2024-11-08 11:25  instr  阅读(4)  评论(0编辑  收藏  举报

导航