从文档中, addEntriesFromDictionary 告诉我们:
如果两个字典包含相同的键,则接收字典的该键的先前值对象将被发送一条释放消息,并且新的值对象将取代它。您需要使用 setObject 将每个对象添加到字典中。您需要遍历一个字典的键并将其添加到最终字典中。
甚至 setObject 也一样:
价值的关键。密钥被复制(使用 copyWithZone:; 密钥必须符合 NSCopying 协议)。如果字典中已经存在 aKey,则使用 anObject 代替它。字典中不能有两个相同的键。字典中的所有键都是唯一的。
如果您仍然希望在字典中具有相同的键值,则必须使用不同的键。
例如,您有两个具有以下值的字典:
NSDictionary *dict1=@{@"hello":@"1",@"hello2" :@"2"};
NSDictionary *dict2=@{@"hello":@"1",@"hello2":@"2",@"hello3":@"1",@"hello6":@"2",@"hello4":@"1",@"hello5" :@"2"};
NSMutableDictionary *mutableDict=[NSMutableDictionary dictionaryWithDictionary:dict1];
for (id key in dict2.allKeys){
for (id subKey in dict1.allKeys){
if (key==subKey) {
[mutableDict setObject:dict2[key] forKey:[NSString stringWithFormat:@"Ext-%@",key]];
}else{
[mutableDict setObject:dict2[key] forKey:key];
}
}
}
在此循环结束时,您的新可变字典将具有以下键值:
{
"Ext-hello" = 1;
"Ext-hello2" = 2;
hello = 1;
hello2 = 2;
hello3 = 1;
hello4 = 1;
hello5 = 2;
hello6 = 2;
}
如您所见,hello 和 hello2 键被重命名为 Ext-hello1、Ext-hello2。形成 dict1,并且您仍然将所有 dict2 值添加到可变 dict 中。
如果您不想添加新键,则可以将值添加到 arrya 并将该数组添加到字典中。您可以将 for 循环修改为:
for (id key in dict2.allKeys){
for (id subKey in dict1.allKeys){
if (key==subKey) {
NSMutableArray *myArr=[[NSMutableArray alloc]init];
[myArr addObject:dict1[subKey]];
[myArr addObject:dict2[key]];
[mutableDict setObject:myArr forKey:key];
}else{
[mutableDict setObject:dict2[key] forKey:key];
}
}
}
现在您将值合并到一个数组中:
{
hello = (
1,
1
);
hello2 = 2;
hello3 = 1;
hello4 = 1;
hello5 = 2;
hello6 = 2;
}
这样,键的数量将相同,并且相同键的值将作为数组添加。