在循环中向字典添加对象会覆盖以前的值

时间:2014-06-01 18:49:28

标签: ios cocoa-touch nsarray nsdictionary

我有三个NSArray,我希望将它们全部合并为一个NSDictionary。问题是当我遍历数组并创建字典时,它会覆盖前一个对象。最后我在字典中只有一个对象。我究竟做错了什么?这是我的代码:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
for(int i=0; i<[array0 count]; i++) {
    [dict setObject:[array0 objectAtIndex:i] 
             forKey:@"one"];
    [dict setObject:[array1 objectAtIndex:i] f
              orKey:@"two"];
    [dict setObject:[array2 objectAtIndex:i] 
             forKey:@"three"];
}

也许这会澄清我的意思...... 这是我要去的结果:

{one = array0_obj0, two = array1_obj0, three = array2_obj0},
{one = array0_obj1, two = array1_obj1, three = array2_obj1},
{one = array0_obj2, two = array1_obj2, three = array2_obj2}, 
etc

由于

4 个答案:

答案 0 :(得分:5)

问题

您正在特定键上插入并替换相同的对象。所以字典的所有内容都是最后一个索引的最后一个对象。

解决方案

使用此代码将三个数组添加到一个带有特定键的字典中。

NSDictionary *yourDictinary = @{@"one": array0, @"two": array1, @"three": array3};

修改

如果您需要将NSMutableArrays的对象添加到一个NSDictionary,您可以按照@ElJay发布的答案进行操作,但这不是一个好习惯,因为您正在处理多个具有唯一键的对象。

更新

为了做到这一点,我们讨论的是单个NSMutableArray和多个NSDictinarys。

请遵循以下代码:

NSMutableArray *allObjects = [NSMutableArray new];
for(int i=0; i<[array0 count]; i++) {
    dict = @{@"one": array0[i], @"two": array1[i], @"three": array2[i]};
    [allObjects addObject:dict];
}

答案 1 :(得分:4)

这里你去:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
for(int i=0; i<[array0 count]; i++) {
    [dict setObject:[array0 objectAtIndex:i] forKey:[NSString stringWithFormat:@"arr0_%d", i]];
    [dict setObject:[array1 objectAtIndex:i] forKey:[NSString stringWithFormat:@"arr1_%d", i]];
    [dict setObject:[array2 objectAtIndex:i] forKey:[NSString stringWithFormat:@"arr2_%d", i]];
}

编辑 - 修改后的问题:

self.array0 = @[@"Array0_0",@"Array0_1",@"Array0_2", @"Array0_3"];
self.array1 = @[@"Array1_0",@"Array1_1",@"Array1_2", @"Array1_3"];
self.array2 = @[@"Array2_0",@"Array2_1",@"Array2_2", @"Array2_3"];

NSMutableArray *finalArray = [[NSMutableArray alloc] init];

for (int i=0; i< [_array0 count]; i++) {

    NSDictionary *dict = @{@"one":[_array0 objectAtIndex:i], @"two":[_array1 objectAtIndex:i],@"three":[_array2 objectAtIndex:i]};
    [finalArray addObject:dict];
}

NSLog(@"finalArray = %@", [finalArray description]);

答案 2 :(得分:3)

您在循环的每次迭代中重复使用键("one", "two" and "three")NSDictionary中的密钥必须是唯一的。

答案 3 :(得分:-1)

如果你想要很多字典但只需要三个键,你应该将每个字典保存在一个数组中。