字典数组如下:
self.listofAllContacts
({ name = "William"; recordID = 541;},{ name = "Soan"; recordID = 541;},{ name = "kamal"; recordID = 541;},{ name = "Elisia"; recordID = 541;},{ name = "Ben"; recordID = 541;},{ name = "Loki"; recordID = 541;},{ name = "Fraser"; recordID = 541;});
组合数组如下:数组命名为
self.arrayOfSearchCombinationsFormed
<__NSArrayM 0x1702518b0>( ABCD,JK,AND,MIKE,Eli,STEV,FRASE,WIIliA )
目前的工作守则:
self.filteredContacts = [[NSMutableArray alloc] init]; NSArray *arrayToTraversed = [[NSArray alloc] initWithArray:self.arrayOfSearchCombinationsFormed]; for(Nsstring *combination in arrayToTraversed){ nspredicate *predicateInsIDeLoop = [nspredicate predicateWithFormat:@"name CONTAINS[cd] %@",combination]; NSArray *filteredContactByname = [self.listofAllContacts filteredArrayUsingPredicate:predicateInsIDeLoop]; if([filteredContactByname count]>0){ [self.filteredContacts addobjectsFromArray:filteredContactByname]; } else{ [self.arrayOfSearchCombinationsFormed removeObject:combination]; } }
目前,这种解决方案效率低下并且消耗大量内存.
任何帮助,将不胜感激.
另请注意,需要从组合数组中删除字典中未找到的任何组合.
所以我的问题是我想要在内存分配方面搜索名称的最有效方法.因此它使用最少的内存.
解决方法 使用(nspredicate *)predicateWithBlock:方法加速搜索可能会有所帮助.假设您有一个键阵列和一个源数组,您想要使用keys数组过滤源数组.
NSArray *keysArray = @[@"1",@"2",@"3"]; NSArray *sourceArray = @[@"12",@"3",@"1",@"2"];
对于sourceArray中的第一个对象@“12”,查看keysArray,因为@“12”包含@“1”,您可以停止过滤并保留两个数组的第一个对象.但是原始代码使用@“1”来过滤sourceArray,结果是@“12”和@“1”,需要检查每个元素.
您可以参考以下代码:
- (voID)searchWithBlock:(NSArray*)keysArray{ NSDate *beginDate = [NSDate date]; NSMutableSet *keySet = [NSMutableSet set]; nspredicate *intersectPredicate = [nspredicate predicateWithBlock:^BOol(ID evaluatedobject,NSDictionary *bindings) { for (Nsstring *str in keysArray) { Nsstring *name = evaluatedobject[@"name"]; NSRange r = [name rangeOfString:str options:NSCaseInsensitiveSearch]; if (r.location != NSNotFound) { [keySet addobject:str]; return true; } } return false; }]; NSArray *intersect = [self.listofAllContacts filteredArrayUsingPredicate:intersectPredicate]; self.filteredContacts = [[NSMutableArray alloc] initWithArray:intersect]; self.arrayOfSearchCombinationsFormed = [NSMutableArray arrayWithArray:[keySet allObjects]]; NSDate *endDate = [NSDate date]; NSTimeInterval interval = [endDate timeIntervalSinceDate:beginDate]; NSLog(@"interval is %f",interval); NSLog(@"intersect %@\n,filtered key array is %@\n",intersect,keySet);}
它需要大约原始时间的1/3进行过滤,内存分配稍微少一些.我建议你将较大的数据源拆分为较小的块以使用较少的内存.
总结以上是内存溢出为你收集整理的ios – 搜索字典数组中的字符串数组全部内容,希望文章能够帮你解决ios – 搜索字典数组中的字符串数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)