Java 中如何对比两个对象的属性值全都相同 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Archangell
V2EX    问与答

Java 中如何对比两个对象的属性值全都相同

  •  
  •   Archangell 2019-08-06 09:18:38 +08:00 8263 次点击
    这是一个创建于 2259 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没有什么工具类可以实现判断同类的两个对象中的值有哪些相同哪些不同,类中属性也可能是其他类也要进行判断是否相同

    举例提交对比 当用户提交一次信息后不通过 第二次提交想要有对比这样的情况对比有哪些字段值不同或相同

    v 站大佬帮帮忙

    22 条回复    2019-08-06 11:24:26 +08:00
    cpyhaha
        1
    cpyhaha  
       2019-08-06 09:24:22 +08:00
    重写 toString 和 equals 就行了
    cpyhaha
        2
    cpyhaha  
       2019-08-06 09:25:38 +08:00
    额 你是要比对每个字段啊,那不太清楚
    crayygy
        3
    crayygy  
       2019-08-06 09:27:04 +08:00 via Android
    不就是 equals 重写一下吗?当然也可以 kotlin data class
    hihipp
        4
    hihipp  
       2019-08-06 09:27:16 +08:00
    我想到的思路是用反射,获取属性值进行比较。
    nihaoaa
        5
    nihaoaa  
       2019-08-06 09:31:31 +08:00
    只能用反射了,用反射重写下 equals 吧
    passerbytiny
        6
    passerbytiny  
       2019-08-06 09:33:49 +08:00
    判断小黑和小白长得一不一样,让小黑自己去判断是最直接,以及最有效的方法。
    Archangell
        7
    Archangell  
    OP
       2019-08-06 10:09:05 +08:00
    @cpyhaha 如果只是单类还好说 如果类中包含其他类 如何对比
    Archangell
        8
    Archangell  
    OP
       2019-08-06 10:10:52 +08:00
    @nihaoaa
    @hihipp 嗯 最简单直接的办法就是反射了 通过获取每个属性值 如果是类的就递归进去 吧这个类中的属性值也判断一遍 但总感觉这样做过于繁琐 而且效率不高
    panhongbo
        9
    panhongbo  
       2019-08-06 10:28:45 +08:00
    转 json,字符串 equals
    MaoMiao
        10
    MaoMiao  
       2019-08-06 10:29:58 +08:00
    apache commons 里有 EqualsBuilder
    icedir
        11
    icedir  
       2019-08-06 10:30:03 +08:00
    楼上的方案我经常用。。
    icedir
        12
    icedir  
       2019-08-06 10:30:25 +08:00
    我说的是 9 楼的
    cpyhaha
        13
    cpyhaha  
       2019-08-06 10:38:50 +08:00
    @Archangell #7 这样的需求我也没遇到过,坐等大佬,不过话说回来,页面不刷新的话,让前端去比较会不会方便一点
    tslling
        14
    tslling  
       2019-08-06 10:42:57 +08:00 via Android
    反射太 hack 了吧,转 json 比字符串更 hack。重写 equals 是标准做法,属性是对象再递归调用它的 equals,用 apache commons 的辅助方法吧。重写 equals 别忘了重写 hashCode。。。
    Sapp
        15
    Sapp  
       2019-08-06 10:46:24 +08:00
    这个提示给前端其实比较好做,只需要吧上一次的保留下来,这次点提交的时候判断一下就行了,比如 react 可以这么干

    {xx[key] === oo[key] ? null : <p>* 字段不同</p>}

    就这一行代码就可以完成你说的提交的时候对比操作了,如果你要对比的这个字段可能是个对象之类的东西,前端也有 lodash 方法可以直接完成对比
    Cstone
        16
    Cstone  
       2019-08-06 10:48:11 +08:00
    https://javers.org/
    这里有一个 maven 工具 javers
    康康符不符合你的需求,也是通过发射做的
    Cstone
        17
    Cstone  
       2019-08-06 10:53:03 +08:00
    补充:支持你要的递归对比
    champloo
        18
    champloo  
       2019-08-06 11:00:31 +08:00 via Android
    重写 equels 方法,在 equels 里调用其他对象的 equels 方法,在比较的同时,用数组装数据类型的字符串
    Archangell
        19
    Archangell  
    OP
       2019-08-06 11:13:42 +08:00
    感谢大家啦 刚刚找到一个比较靠谱的推荐给大家 https://blog.csdn.net/dadiyang/article/details/88782898 亲测简单类很满足 复杂类的话支持重写对比方法 目前还没来得及写
    Archangell
        20
    Archangell  
    OP
       2019-08-06 11:15:06 +08:00
    @panhongbo 是个好办法 但是如何对比出不同值的字段呀
    Archangell
        21
    Archangell  
    OP
       2019-08-06 11:17:28 +08:00
    @Sapp 嗯 不过情况稍微不同 需要后端来判断两个对象有那些个字段值不同 业务现在是这样的 有些值不同无所谓 有些值做改动了 就需要重新提交审核 目前就是需要后端来判断那几个关键字段的值是否改动 在做后续处理
    Archangell
        22
    Archangell  
    OP
       2019-08-06 11:24:26 +08:00
    @Cstone 牛逼老铁 这就是我苦苦追寻的 666 https://javers.org/ 好东西
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3871 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:14 PVG 08:14 LAX 17:14 JFK 20:14
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86