通过键搜索字典数组

Posted

技术标签:

【中文标题】通过键搜索字典数组【英文标题】:Searching on an array of array of dictionaries by a key 【发布时间】:2014-10-09 12:52:58 【问题描述】:

我有这样的字典

  NSDictionary *dictA = @ @"name" : @"John",
                           @"city" : @"Los Angeles" ;

  NSDictionary *dictB = @ @"name" : @"Bob",
                           @"city" : @"Los Angeles" ;

  NSDictionary *dictC = @ @"name" : @"Carl",
                           @"city" : @"Dallas" ;

像这样的几十个字典被城市分开,放在其他字典里

  NSArray *losAngeles = @[ dictA, dictB, ....];

  NSArray *dallas = @[ dictC, ... ];

一切都在一个数组中

self.arrayAll = @[losAngeles, dallas, miami... ];

现在更好的部分是,我想要一个包含 Bob 的字典(假设所有的名字都是唯一的)。

如果那是一个字典数组,我会这样做

  NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"];
  NSarray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred];

但是因为arrayAll是一个dicts数组,所以这不适用于以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法对不是字符串的内容进行子字符串操作????

有什么线索吗?

【问题讨论】:

【参考方案1】:

我会这样做......

NSMutableArray *results = [NSMutableArray array];

[citiesArray enumerateObjectsUsingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"];
    NSArray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred];

    [results addObjectsFromArray:filteredNames];
];

您可以像这样添加并发选项...

[citiesArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) 
    //stuff...
];

让它也同时运行。我不知道结果数组将如何处理。试试看吧。

这将利用所有步骤的快速枚举和并发性。

【讨论】:

别担心,乐于助人。【参考方案2】:

你为什么不做一个快速枚举? 比如:

for (NSArray *cityArray in self.arrayAll) 

   for (NSDictionary *cityDictionary in cityArray) 

    if ([[cityDictionary valueForKey:@"name"] isEqualToString:@"Bob"]) 
      //do something
    

  


【讨论】:

我也在考虑这个,但是对于设备来说不是超级重吗? 没有。这种枚举一直发生在不同的框架中,但同时发生。我建议您在不同的线程上执行此操作,如果您需要从中更新 UI,只需调用主线程即可。

以上是关于通过键搜索字典数组的主要内容,如果未能解决你的问题,请参考以下文章

python3字典

python字典

星计划---Python‘情侣站’(字典)

MySQL通过数组中的键搜索json值

php多维数组通过多个键和值搜索

使用字节数组作为字典键[重复]