baidu_37252709
lPsycongroo
采纳率61.1%
2018-01-12 08:51 浏览 7.2k
已采纳

java 两个相同的对象属性值的比较

40

需求:比较两个相同的对象,得到不同的属性值的属性和属性值,后面才是重点:对像里面包含其他的对象,也要拿出来,例如:两个user对象,user里面包含部门,如果两个user下面的部门不一致,要得到分别的部门名称,user还有标签组(是个集合),如果不同也有得到,有办法做吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

10条回答 默认 最新

  • 已采纳
    caozhy 从今以后生命中的每一秒都属于我爱的人 2018-01-12 15:40

    反射遍历属性,遇到属性是对象的,递归比较

    这里有个例子:

    
    public class CompareObject {  
        public static void main(String[] args) {  
            Dog dog1 = new Dog("大师兄的dog", true, true);  
            Dog dog2 = new Dog("大师兄的dog", false, false);  
            List<Dog> dogs = Lists.newArrayList();  
            List<Dog> myDogs = Lists.newArrayList();  
            dogs.add(dog1);  
            myDogs.add(dog2);  
            List<String> boys = Lists.newArrayList("tom", "jerry", "jack");  
            //List<String> myBoys = Lists.newArrayList("tom", "jerry", "jack");//这行注释打开,下行代码注释掉,则boys属性就相同了  
            List<String> myBoys = Lists.newArrayList("tom hanks", "gery", "pul");  
            Car car1 = new Car("q7", 182, dogs, boys);  
            Car car2 = new Car("a6", 152, myDogs, myBoys);  
            contrastObj(car1, car2);  
        }  
    
        private static void contrastObj(Object obj1, Object obj2) {  
            if (obj1 instanceof Car && obj2 instanceof Car) {  
                Car pojo1 = (Car) obj1;  
                Car pojo2 = (Car) obj2;  
                List<String> textList = Lists.newArrayList();  
                try {  
                    Class clazz = pojo1.getClass();  
                    Field[] fields = pojo1.getClass().getDeclaredFields();  
                    for (Field field : fields) {  
                        PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);  
                        Method getMethod = pd.getReadMethod();  
                        Object o1 = getMethod.invoke(pojo1);  
                        Object o2 = getMethod.invoke(pojo2);  
                        String s1 = o1 == null ? "" : o1.toString();//避免空指针异常  
                        String s2 = o2 == null ? "" : o2.toString();//避免空指针异常  
                        //思考下面注释的这一行:会bug的,虽然被try catch了,程序没报错,但是结果不是我们想要的  
                        //if (!o1.toString().equals(o2.toString())) {  
                        if (!s1.equals(s2)) {  
                            textList.add("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");  
                        }  
                    }  
                } catch (Exception e) {  
                    System.out.println(e.getMessage());  
                }  
                for (Object object : textList) {  
                    System.out.println(object);  
                }  
            }  
        }  
    }  
    

    具体看这里:http://blog.csdn.net/qq_27093465/article/details/62453581

    点赞 评论 复制链接分享
  • doublelife_ke doublelife_ke 2018-01-13 02:31

    package com.zjk.utils;

    import com.zjk.common.MyException;

    import java.lang.reflect.Field;

    public class CompareUtil {

    public static String compareTwoClass(Object class1, Object class2) {
        StringBuilder sb = new StringBuilder();
        //获取对象的class
        try {
            Class<?> clazz1 = class1.getClass();
            Class<?> clazz2 = class2.getClass();
            //获取对象的属性列表
            Field[] field1 = clazz1.getDeclaredFields();
            Field[] field2 = clazz2.getDeclaredFields();
            //遍历属性列表field1
            for (int i = 0; i < field1.length; i++) {
                //遍历属性列表field2
                for (int j = 0; j < field2.length; j++) {
                    //如果field1[i]属性名与field2[j]属性名内容相同
                    if (!field1[i].getName().equals(field2[j].getName())) {
                        continue;
                    }
                    field1[i].setAccessible(true);
                    field2[j].setAccessible(true);
                    if (field2[j].get(class2) == null) {
                        break;
                    }
                    //如果field1[i]属性值与field2[j]属性值内容不相同
                    if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
                        sb.append(field1[i].getName());
                        sb.append("【" + field1[i].get(class1));
                        sb.append("->" + field2[j].get(class2));
                        sb.append("】,");
                    }
                    break;
                }
            }
        } catch (Exception e) {
            throw new MyException(e.getMessage());
        }
        return sb.deleteCharAt(sb.length() - 1).toString();
    }
    
    public static boolean compareTwo(Object object1, Object object2) {
        if (object1 == null && object2 == null) {
            return true;
        }
        if (object1 == null && object2 != null) {
            return false;
        }
        if (object1.equals(object2)) {
            return true;
        }
        return false;
    }
    

    }

    点赞 1 评论 复制链接分享
  • moyunxin moyunxin 2018-01-12 09:36

    覆盖equals,然后递归调用equals

    点赞 评论 复制链接分享
  • morgerton 白萝卜blb 2018-01-12 09:46

    user对象继承自object,重写 object的 equals方法,自己定义equals方法,重写toString方法自己定义返回对象。

    点赞 评论 复制链接分享
  • proprect123 wang_xuewen 2018-01-12 09:47

    重载equals,将不同的值返回就可以

    点赞 评论 复制链接分享
  • lu_zhou lu_zhou 2018-01-12 10:00

    本身的equals方法比较的是地址值,如果是比较他们的内容(地址不一样,内容可能一样),那么需要重写equals方法,user比较之后,你再比较部门对象,类似

    点赞 评论 复制链接分享
  • sinat_34344123 星尘的一个朋友 2018-01-12 12:46

    重写equals方法就可以实现这个需求.

    点赞 评论 复制链接分享
  • itcaoji itcaoji 2018-01-16 01:16

    两个对象比较的是地址值,属性比较的是equals方法

    点赞 评论 复制链接分享
  • baidu_37252709 lPsycongroo 2018-01-19 03:13

    能不能弄个代码出来,如果是对象,递归这一步

    点赞 评论 复制链接分享
  • weixin_41398432 trick-or-treat 2021-06-10 10:08
    点赞 评论 复制链接分享

相关推荐