假设我有两个具有唯一ID的对象列表和一个确定其顺序的属性,我如何有效地获取delta索引(插入了哪些索引,哪些已删除,哪些被移动)?
输入示例:
let before: [(id: String, timestamp: String)] = [
("A", "2015-06-04T12:38:09Z"),
("B", "2015-06-04T10:12:45Z"),
("C", "2015-06-04T08:39:55Z"),
("D", "2015-06-03T23:58:32Z"),
("E", "2015-06-01T00:05:51Z"),
]
let after: [(id: String, timestamp: String)] = [
("F", "2015-06-04T16:13:01Z"),
("C", "2015-06-04T15:10:29Z"),
("A", "2015-06-04T12:38:09Z"),
("B", "2015-06-04T10:12:45Z"),
]
let delta = deltaFn(before, after)
Run Code Online (Sandbox Code Playgroud)
以上是可视化的:
BEFORE AFTER
+-------+----+----------------------+ +-------+----+----------------------+
| index | id | timestamp | | index | id | timestamp |
+-------+----+----------------------+ +-------+----+----------------------+
| 0 | A | 2015-06-04T12:38:09Z | | 0 | F | 2015-06-04T16:13:01Z |
| 1 …
Run Code Online (Sandbox Code Playgroud) 具体来说,我有两个清单:
List<SystemUserWithNameAndId> list1;
List<SystemUserWithNameAndId> list2;
Run Code Online (Sandbox Code Playgroud)
我想检查它们是否包含相同的系统用户,并且订购不是问题.我尝试先使用比较器对它们进行排序,然后使用列表的equals()方法检查它们是否相等.但我不想覆盖SystemUserWithNameAndId的equals方法,我想知道我是否可以使用我为排序创建的比较器或类似的比较器来检查相等性,而不会在排序后显式迭代列表.
Comparator<SystemUserWithNameAndId> systemUserComparator = new Comparator<SystemUserWithNameAndId>()
{
@Override
public int compare(SystemUserWithNameAndId systemUser1, SystemUserWithNameAndId systemUser2)
{
final int systemUserId1 = systemUser1.getSystemUserId();
final int systemUserId2 = systemUser2.getSystemUserId();
return systemUserId1 == systemUserId2
? 0
: systemUserId1 - systemUserId2;
}
};
Collections.sort(systemUsers1, systemUserComparator);
Collections.sort(systemUsers2, systemUserComparator);
return systemUsers1.equals(systemUsers2);
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够说,
CollectionUtils.isEqualCollections(systemUsers1, systemUsers2, someCustomComparator);
Run Code Online (Sandbox Code Playgroud)