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

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

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

  • 写回答

10条回答 默认 最新

  • threenewbee 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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 PFENet的预训练权重
  • ¥15 程序哪有错误怎么改?
  • ¥15 交换机和交换机之间的链路带宽以及主机带宽的理解
  • ¥15 ai创想家对战模式代码
  • ¥15 集合A由3个2行4列二维数组构成,从集合A中任意取一个二维数组元素、如果该二维数组元素的对应列位置的上、下两数都是奇数,而且仅有2个列是奇数/奇数,则该数组有意义,并放入集合B中打印输出。
  • ¥15 电信IPV6 无法外网访问吗
  • ¥15 有偿求效果比较好的遥感影像匹配的c++代码
  • ¥15 博主,你好,我下载了你的智能网联汽车辅助驾驶安全信息检测系统,现在不会运行,可以教我吗,
  • ¥15 怎么在excle输入下列公式
  • ¥15 Arduino,利用modbus的RS485协议,进行对外置的温湿度传感器进行数据读取