【问题标题】:Adding objects to dictionary in a loop overwrites previous values在循环中将对象添加到字典会覆盖以前的值
【发布时间】:2014-06-01 18:49:27
【问题描述】:

我有三个NSArrays,我想将它们全部组合成一个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

谢谢

【问题讨论】:

  • 就像数组每个索引有一个对象一样,字典每个键有一个对象。您在循环的每次迭代中都使用键 @"one"、@"two" 和 @"three",因此会覆盖字典为每个这些键存储的一个对象。回到数组的类比,这相当于每次通过循环总是分配给数组的相同索引,从而覆盖之前在相同索引处的内容。
  • 旁注:[NSString stringWithFormat:@"string that has no formatting specifiers"] 没有多大意义。直接使用文字字符串即可。
  • 见下面的修改答案
  • 这段代码为我做了。
  • code[allDevices addObjectsFromArray:[NSArray arrayWithObjects:[NSMutableDictionary dictionaryWithObjects: [NSArray arrayWithObjects: rowID, name, company, nil] forKeys:[NSArray arrayWithObjects: @"rowID", @"name" , @"公司", nil]], nil]];code

标签: ios cocoa-touch nsarray nsdictionary


【解决方案1】:

问题

您在特定键处插入和替换相同的对象。所以字典所拥有的只是它在最后一个索引处的最后一个对象。

解决方案

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

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

编辑

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

更新

为此,我们讨论的是单个 NSMutableArray 和多个 NSDictinary。

按照此代码:

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];
}

【讨论】:

  • 这不是用户该做什么。他想将字典中的所有对象组合起来,而不是字典中的 3 个数组。显然用户正在以一种不好的方式解决问题..我不知道他想做什么。
  • @MatteoGobbi 查看 OP,他想将 3 个数组添加到一个字典中!他并没有告诉他要在同一个 NSDictionary 中添加所有对象。这对特定的键没有意义。
  • 他的努力表明@MatteoGobbi 是对的。他似乎想要将所有对象(无论听起来多么奇怪)都放入一个字典中。
  • @ElJay 我一直在关注他的问题,但如果我误解了他的意思,我也编辑了问题,但这不是做事的好方法(我不知道你添加所有对象的计划到一个 NSDictionary)
  • @d.barrett000 你也可以创建 JSON 数组
【解决方案2】:

来吧:

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]);

【讨论】:

  • 实际上...这并不能满足我的需求。不过感谢您的尝试。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这个问题没问题,但请提供更多信息,因为这就是你被否决的原因!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2019-04-11
    • 2012-10-02
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多