【发布时间】:2017-01-05 00:50:42
【问题描述】:
我在多个客户端上同步数据时遇到问题。 为简单起见,假设我有两个可能重复的集合(name 是关键):
"collection1": [
{
"name": "a",
"timestamp": 1
},
{
"name": "a",
"timestamp": 2
},
{
"name": "b",
"timestamp": 1
}]
"collection2": [
{
"name": "a",
"timestamp": 3
},
{
"name": "c",
"timestamp": 2
}]
我希望收集没有重复(name 是关键),具有最高的时间戳值。所以合并后应该是这样的:
"collection3": [
{
"name": "b",
"timestamp": 1
},
{
"name": "a",
"timestamp": 3
},
{
"name": "c",
"timestamp": 2
}]
顺便说一句。我不在乎秩序。 我不能简单地 Set = new HashSet(collectionn); 因为缺少替换重载。
我的想法是做 3 次 removeDuplication
- collection1 和 collection1
- collection2 和 collection2
- collection1 与 collection2
使用这个 O(n^2) removeDuplication 函数:
LinkedList<MyObject> finalList = new LinkedList<>();
for (MyObject newObject : collection) {
boolean foundSimillar = false;
for (MyObject objectAlreadyAdded : finalList) {
if (Objects.equals(newObject, objectAlreadyAdded)) { // in this case if(name1 == name2)
foundSimillar = true;
long newObjectTime = newObject.lastTimeModified;
long alreadyAddedObjectTime = objectAlreadyAdded.lastTimeModified;
if (newObjectTime > alreadyAddedObjectTime) {
finalList.remove(objectAlreadyAdded);
finalList.add(newObject);
break;
}
}
}
if(!foundSimillar)
finalList.add(newObject);
}
还有比我的 3 * O(n^2) 更有效的算法吗?
【问题讨论】:
-
是否有不能创建空哈希集的原因。然后,对于列表中的每个项目,检查它是否在哈希集中,如果没有则添加它?那将是 O(n)。
-
@JimMischel 如果已经有项目,但时间戳较低怎么办?它需要更换,但不能。
-
当然可以。从哈希集中删除现有的并添加新的。或者,使用地图并更新它。
标签: java algorithm collections merge