【问题标题】:How to add the object array to nsmutabledictionary with another array as key如何以另一个数组为键将对象数组添加到 nsmutabledictionary
【发布时间】:2011-11-23 06:47:46
【问题描述】:
for(Attribute* attribute in appDelegate.attributeArray) {
    attribute = [appDelegate.attributeArray objectAtIndex:z];
    attri = attribute.zName;
    int y = 0;
    for(Row* r in appDelegate.elementsArray) {
        r = [appDelegate.elementsArray objectAtIndex:y];
        NSString *ele = r.language;
        if([attri isEqualToString:ele]) {
            NSLog(@"=================+++++++++++++++++%@ %@",attri, r.user);
            [aaa insertObject:r atIndex:y]; //here i am adding the value to array
            [dict setObject:aaa forKey:attri]; //here i am adding the array to dictionary
        }
        y++;
    }
    z++;
    NSLog(@"============$$$$$$$$$$$$$$$$$$$$$$$++++++++++ %@",dict);
}

一个数组中的键和另一个数组中的值和值数组是对象格式。

我需要为单个键存储多对象。 attributeArray 具有键值,elementsArray 具有对象。例如,attributeArray 可能具有值

 " English, French, German..."

elementsArray 可能有对象值

"<Row: 0x4b29d40>, <Row: 0x4b497a0>, <Row: 0x4e38940>, <Row: 0x4b2a070>, <Row: 0x4b29ab0>, <Row: 0x4b178a0> "

在第一个值中,我需要存储两个对象,第二个键需要存储 3 个对象,第三个键需要存储字典中的最后两个对象。

【问题讨论】:

  • 这里我需要为单个键存储多对象。这里的attributeArray 具有键值和elementsArray 具有对象。例如attributeArray 具有值“英语,法语,德国.. .”以及第一个值中具有对象值“, , , , , 的elementsArray我需要存储这两个对象,对于第二个键,我需要存储 3 个对象,而对于需要在字典中存储最后 2 个对象的 3 个键。

标签: iphone objective-c nsmutablearray nsmutabledictionary


【解决方案1】:

为了超级简化,您可以使用以下代码:

NSArray *keys = ...;
NSArray *values = ...;

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjects: values forKeys: keys];

希望,这会有所帮助。

更新:

要在字典中存储单个键的多个值,只需使用 NSArray / NSMutableArray 作为您的对象:

NSArray *keys = ...;
NSMutableDictionary *dict = [NSMutableDictionary dictionary];

for( id theKey in keys) 
{
  NSMutableArray *item = [NSMutableArray array];
  [item addObject: ...];
  [item addObject: ...];
  ...

  [dict setObject: item forKey: theKey];
}

如果一开始不知道key的所有值,需要一一添加,可以使用如下方法:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

for( /*some cycling condition here */) 
{
  id keyToUse = ...;
  id valueToAdd = ...;

  id foundArray = [dict objectForKey: keyToUse];
  if ( nil == foundArray )
  {
    foundArray = [NSMutableArray array];
    [dict setObject: foundArray forKey: keyToUse];
  }

  [foundArray addObject: valueToAdd];
}

【讨论】:

  • 谢谢丹尼斯,我想你已经部分理解了我的问题,如果我没有向verbia解释它。如果可能的话,你可以检查一下。
  • 首先我解析文件 testxml 文件并将其存储在两个数组中,并尝试将数组作为字典显示在表视图中。在表视图中,标题是用户语言中的属性值和tableviewcell 应该显示用户名、url 和 cdate。但我不会做字典。
  • 代码因越界异常而崩溃的原因是因为您没有在“for(Row* r in appDelegate.elementsArray) {id valueToAdd = [appDelegate.elementsArray objectAtIndex:e];"在 XMLParser.m 中;之后,您将在“id keyToUse = [appDelegate.headerArray objectAtIndex:d];”行看到崩溃,因为 headerArray 和 elementsArray 有不同的计数;另外,我不明白,你为什么在 for-each 循环语句中使用索引访问
  • 获取存储在 elementarray 中的对象的值。有没有其他方法可以访问这些值。
  • 您可以像下面这样迭代数组项:for(id theKey in keys) { NSLog(theKey);} 在数组的每次迭代中,theKey 将是数组中的下一项
【解决方案2】:

在我看来,您正在设置一个以字符串 (attri) 作为键的数组 (aaa)。

将一个数组设置为键,将另一个数组设置为对象。您可以使用以下方法做到这一点。

NSMutableDictionary *myDictionary = [NSMutableDictionary dictionaryWithCapacity:1];

NSArray *valueArray = [NSArray arrayWithObjects:@"v1", @"v2", nil];
NSArray *keyArray = [NSArray arrayWithObjects:@"k1",@"k2", nil];

[myDictionary setObject:valueArray forKey:keyArray];
NSLog(@"myDictionary: %@", myDictionary);

但是您应该查看您的代码并提供更简短的说明,说明您想要实现什么目标以及您如何采取这种方法。

问候,

阿尔斯兰

【讨论】:

  • 这不是一个好的解决方案 - 你有一个数组实例作为键:/
  • @Denis 。我知道这不是一个好的解决方案,但我认为这就是问题所在。 Bala 已经解释了这个问题,现在您可以根据用户提供的解释看到我的回答是合适的,因为值和键数组可以有不同的长度。但是,如果我们要使用“dictionaryWithObjects: values forKeys: keys”,那么我们必须确保两个数组的长度相同,而用户实际上并没有在寻找。我希望我已经清楚了我的观点。谢谢。
  • 我的观点是这不是一个好的解决方案,使用集合实例作为关键,没有什么个人的
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多