我有NSMutableArray
和NSArray
。两者都由NSDictionarys
本身的元素组成。
两者的样本结构如下:
NSMutableArray
[
{
objectId = 4274;
name = orange;
price = 45;
status = approved;
},
{
objectId = 9035;
name = apple;
price = 56;
status = approved;
},
{
objectId = 7336;
name = banana;
price = 48;
status = approved;
}
.
.
.
.
]
和NSAraay是
NSArray
[
{
objectId = 4274;
name = orange;
price = 106;
status = not_approved;
},
{
objectId = 5503;
name = apple;
price = 56;
status = approved;
}
]
我想要合并这两个数组,以便NSArray
中的任何元素与objectId
中的任何元素具有相同的NSMutableArray
,NSArray
中的元素应该覆盖on NSMutableArray
中的元素。
所以在这种情况下,最终合并的数组应该看起来像这样
MergedArray
[
{
objectId = 4274;
name = orange;
price = 106;
status = not_approved;
},
{
objectId = 9035;
name = apple;
price = 56;
status = approved;
},
{
objectId = 7336;
name = banana;
price = 48;
status = approved;
},
{
objectId = 5503;
name = apple;
price = 56;
status = approved;
}
.
.
.
.
]
我知道的唯一方法是迭代两个数组并合并。有没有更好的方法?任何帮助将不胜感激。
修改:
按照dasblinkenlights的建议,我按照以下方式做了
-(NSMutableArray*)mergeTwoArray:(NSArray*)array1 :(NSArray*)array2
{
//array1 will overwrite on array2
NSSet* parentSet = [NSSet setWithArray:array2];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSDictionary *item in parentSet)
[dict setObject: item forKey: [item objectForKey:@"objectId"]];
NSLog(@"initial dictionary is %@",dict);
for (NSDictionary *item in array1)
[dict setObject: item forKey: [item objectForKey:@"objectId"]];
NSLog(@"final dictionary is %@ with all values %@", dict,[dict allValues]);
return [NSMutableArray arrayWithArray:[dict allValues]];
}
答案 0 :(得分:2)
由于您的objectId
值可以用作唯一键,因此您可以在侧面创建NSMutableDictionary
,使用{{1来填充第一个数组中的NSDictionary
个对象将value作为键,遍历第二个数组,执行覆盖,最后将结果objectId
的值收集到最终输出中。
请注意,只有当您的阵列相对较长(1000多个项目)时,此方法可能才有用。如果您处理10..100项,我不会打扰,并按照您的建议编写两个嵌套循环。
答案 1 :(得分:1)
我建议迭代两个数组并合并,但首先对它们进行排序。排序后,您可以在O(N)时间内合并两个数组。在大多数情况下,这个速度与您可以获得的速度一样快,而且只需要很少的代码。
如果它们足够大以至于排序是一个瓶颈,那么你可以使用NSSet
来表达:首先将(元素)覆盖数组置于集合中,然后添加元素原始数组。但是你必须为你的元素实现一个isEqual方法。在这种情况下,这意味着您的元素将不再是NSDictionary
,而是一个继承自NSDictionary
的类,但实现了isEqual方法来比较对象ID字段。
因为NSSet
给出了分摊的常量时间访问,如果数组很大,这会更快,因为没有排序阶段。