循环遍历 NSDictionary 以创建单独的 NSArray

Posted

技术标签:

【中文标题】循环遍历 NSDictionary 以创建单独的 NSArray【英文标题】:Loop through NSDictionary to create separate NSArrays 【发布时间】:2011-01-16 20:12:43 【问题描述】:

我有一个大的NSDictionary,我需要循环并创建单独的NSArrays。以下是内容:

(
        
        id =         
            text = "";
        ;
        sub =         
            text = " , ";
        ;
        text = "";
        "thumb_url" =         
            text = "";
        ;
        title =         
            text = "2010-2011";
        ;
        type =         
            text = "title";
        ;
    ,
        
        id =         
            text = "76773";
        ;
        sub =         
            text = "December 13, 2010";
        ;
        text = "";
        "thumb_url" =         
            text = "http://www.puc.edu/__data/assets/image/0004/76774/varieties/thumb.jpg";
        ;
        title =         
            text = "College Days - Fall 2010";
        ;
        type =         
            text = "gallery";
        ;
    ,
        
        id =         
            text = "";
        ;
        sub =         
            text = "";
        ;
        text = "";
        "thumb_url" =         
            text = "";
        ;
        title =         
            text = "2009-2010";
        ;
        type =         
            text = "title";
        ;
    ,
        
        id =         
            text = "76302";
        ;
        sub =         
            text = "December 3, 2010";
        ;
        text = "";
        "thumb_url" =         
            text = "http://www.puc.edu/__data/assets/image/0019/76303/varieties/thumb.jpg";
        ;
        title =         
            text = "Christmas Colloquy";
        ;
        type =         
            text = "gallery";
        ;
    
)

每个部分都有一个类型键,我需要检查它。当它找到title 键时,我需要将它们添加到数组中。然后将使用gallery 键的下一部分需要位于其自己的数组中,直到找到另一个title 键。然后将gallery 之后的键放入自己的数组中。

我正在使用UITableView 部分标题和内容。所以,上面的NSDictionary 应该有一个NSArray *titles; 数组和另外两个数组,每个数组都包含标题之后的画廊。

我尝试过使用for 循环,但我似乎无法做到正确。任何想法将不胜感激。

【问题讨论】:

【参考方案1】:

你的日志有点不清楚,但我猜你的NSDictionary 的值是NSDictionary?如果是这样:

NSMutableArray *titles = [NSMutableArray array];
// etc.

for (id key in sourceDictionary) 
  NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
  if ([subDictionary objectForKey:@"type"] == @"title")
    [titles addObject:[subDictionary objectForKey:@"title"]];
  // etc.

您的问题有点不清楚...但这是您正确循环 NSDictionary 的方式。

编辑:

NSMutableDictionary *galleries = [NSMutableDictionary dictionary];
NSString *currentTitle;

for (id key in sourceDictionary) 
  NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
  NSString *type = [subDictionary objectForKey:@"type"];
  if (type == @"title") 
    currentTitle = [subDictionary objectForKey:@"title"];
    if ([galleries objectForKey:currentTitle] == nil)
      [galleries setObject:[NSMutableArray array] forKey:currentTitle];
   else if (type == @"gallery" && currentTitle != nil)
    [[galleries objectForKey:currentTitle] addObject:subDictionary];

在此循环之后,galleries 将包含 NSString 类型的键(带有标题的值)和 NSArray 类型的对应对象(带有库 NSDictionarys 的值)。希望这就是你想要的。

【讨论】:

是的,我的 NSDictionary 的值为 NSDicitonary。 如您所见,在每个标题键之后都有一些其他没有使用标题键的字典。因此,如果在标题键字典之后还有 5 个字典,我想将这 5 个放入一个新数组中。然后,如果我看到另一个标题键,则将 NSDictionaries 后面的那些放入一个数组中。 我明白了。我能想到的唯一问题是 NSDictionary 是一个键/值集,不能保证按照您可能期望的顺序。不过,我会相应地编辑我的答案。 我正在从 XML 创建这些字典,所以我很确定顺序会保持不变。 如果可以使用,enumerateWithBlock: 枚举字典的效率明显更高。【参考方案2】:
NSString *key;
for(key in someDictionary)
     NSLog(@"Key: %@, Value %@", key, [someDictionary objectForKey: key]);

【讨论】:

【参考方案3】:

现代 Objective-C 语法:

NSMutableArray *things = [NSMutableArray array];
NSMutableArray *stuff = [NSMutableArray array];
NSMutableArray *bits = [NSMutableArray array];

[dictionaries enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
    [things addObject:[obj valueForKeyPath:@"thing"]];
    [stuff addObject:[obj valueForKeyPath:@"enclosing_object.stuff"]];
    [bits addObject:[obj valueForKeyPath:@"bits"]];
];

【讨论】:

以上是关于循环遍历 NSDictionary 以创建单独的 NSArray的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在目标 C 中循环遍历 nsdictionary,其中键值未知且字典深度嵌套

NSDictionary的遍历

如何循环遍历城市列表以计算它们之间的距离

循环 json 文件以在我的表中获取单独的元素

递归遍历未知结构的NSDictionary

循环遍历 pandas 列名以创建列表