java - Java中基于等式生成Hash码
问题描述
我会将数据库中存在的对象(员工实体类)列表提取到 List1。我将从 Excel 表中读取对象列表以说 List2。
Employee 实体类将具有多个属性,例如 firstName、middleName、lastName、age、phoneNumber、address、SSN、employeeId 等。
List1 中的对象 o1 将等于 List2 中的对象 o2,基于以下任一条件: 1. o1 和 o2 的 firstName、middleName 和 lastName 相等。2、o1和o2的SSN相等。3. o1 和o2 的employeeId 相等。
如果 o1 和 o2 基于上述任一条件相等,则意味着它应该将 o2 的地址、电话号码等属性更新为 o1。如果 o1 != o2,则在数据库中创建一条新记录。以上可以通过对这些列表进行多次迭代来实现。
但我正在寻找一种设计来构造 2 个 HashMaps map1 和 map2,一个用于现有记录(List1),一个用于 excel 表(List2)中的新记录。
HashMap 的键应该是 [firstName, middleName, lastName] 或 [SSN] 或 [employeeId] 的 HashCode,值将是整个对象。这样我就可以从map1中获取Key,并在map2中通过key查找,如果存在,将map2中的其他属性更新为map1并将其保存到数据库中。
不确定如何构建此 HashCode 方法。有可能还是会违反标准?
解决方案
这里仅有的两个标准是:
- 如果对象是
equal
,它们应该具有相同hashCode
的(仅在这个方向上) - 它被称为“equals-hashcode contract”。 hashCode
应该只依赖于对象的字段。
在这种情况下,不可能构建hashCode
正确的上述规则。
因为你可以有3个人:
- 1st 和 2nd 将具有相同的 firstName、middleName 和 lastName
- 2nd 和 3rd 将具有相同的 SSN 但名称不同
所有这三个人都应该返回相同的hashCode
,因为他们是equal
。但他们hashCode
应该只依赖于领域。结论是 - 在这种情况下hashCode
,将取决于比较的上下文,而不仅仅是字段。怎么了。
推荐阅读
- java - 如何在 GCP Pub Sub 中配置非持久消息?
- java - 如何使用 Android 中的按钮进行虚线形选项卡选择?
- c++ - chrono类型到字符串c ++ 20
- python - 7.500000e+04 ,我怎么知道这个值是数千还是百万?
- firebase - 使用 FirebaseAuth 实现重置密码并重定向到我自己的自定义页面以在 Flutter 中重置密码
- ios - Fastlane run_tests error 测试失败 | 找不到目标“i386-apple-ios-simulator”的模块“TestSDK”
- firebase - 如何转换`流
>>` 到列表? - c# - 使用 SDK 创建和更新 AWS Event Bus
- html - 有人可以解释默认值在 CSS 中的工作原理吗,(据说)默认值在添加时会改变布局
- android - android webrtc 崩溃无法用 err 0xfffffff4 实例化编解码器“OMX.qcom.video.decoder.vp8”