【发布时间】:2017-05-05 20:23:40
【问题描述】:
我有两个大小可能不相等的集合或数组列表需要进行比较。一个集合是从 REST 有效负载中新下载的对象集合。另一个是来自对象集合的本地存储库的集合。两个集合都不会有重复的对象。
想法是从本地存储库中的现有对象中找到本地存储库中不存在的新对象或已下载集合中已更新的对象。因此,该类最终将有两种方法返回新对象和更新对象的集合
对象的签名包括:
membershipObject:
id
start_date
end_date
uniqueId
id 和 uniqueId 在集合中是独一无二的,因此非常适合比较它们。 start_date 通常不会更改,但 end_date 可以为 null 或具有 datetime 对象。我有一种支持方法可以根据 end_date 是否为 null 来查找对象是“活动”还是“非活动”。
如果自上次下载后end_date 已更改,则认为对象已更新。
例如:
downloadedCollection
0:
id: 1
start_date: 2017-05-01 00:00:00
end_date: null
uniqueId: <unique-string-abc>
1:
id: 2
start_date: 2017-04-01 00:00:00
end_date: 2017-05-02 00:00:00
uniqueId: <unique-string-cde>
2:
id: 3
start_date: 2017-05-01 10:00:00
end_date: null
uniqueId: <unique-string-def>
localCollection
0:
id: 1
start_date: 2017-05-01 00:00:00
end_date: null
uniqueId: <unique-string-abc>
1:
id: 2
start_date: 2017-04-01 00:00:00
end_date: null
uniqueId: <unique-string-cde>
在上面的示例中,id 2 已更新,id 3 是 downloadedCollection 的新成员。
考虑到操作的复杂性,比较这两个集合的理想 Java 方法是什么? Java SDK 7。
【问题讨论】:
-
一般您不会尝试比较数据来确定发生了什么变化。相反,当您更改任何内容以让任何管理系统都知道要查看的内容时,您会设置一个“脏”标志。
-
如果你需要执行描述的操作,那么你可以为成员对象实现一个像样的
hashCode()方法,以及一个对应的equals()方法。然后创建一个包含新下载列表元素的HashSet,然后创建removeAll()引用列表的元素。在成员的equals()方法定义的意义上,无论剩余的元素是新元素还是与参考列表不同。 -
@azurefrog 由于这是从 REST 服务下载的,因此无法真正期望该服务知道客户端上的脏内容。假设客户实际上需要知道发生了什么变化(而不是简单地使用服务中的最新数据),JohnBollinger 的解决方案非常好。
-
@JohnBollinger 您的解决方案有效。我能够分离新的/更新的成员对象。在调用
removeAll()之后,如果我需要将剩余的成员对象过滤成两个单独的集合,我目前得到的解决方案是遍历localCollection 和HashSet。我正在检查 localCollection 中的唯一 ID,并将其添加到 updatedMemberSet 并从 HashSet 中删除。我最终得到了两组,一组是新成员,另一组是更新成员。可以说,有没有更好的方法来做到这一点?
标签: java performance collections comparison java-7