HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 搜索字典数组中的字符串数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一组需要在另一个字典数组中搜索的组合

字典数组如下:

({
    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;
});

组合数组如下:数组命名为

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

目前,这种解决方案效率低下并且消耗大量内存.
任何帮助,将不胜感激.

另请注意,需要从组合数组中删除字典中未找到的任何组合.

所以我的问题是我想要在内存分配方面搜索名称的最有效方法.因此它使用最少的内存.

@H_404_43@解决方法
使用(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 – 搜索字典数组中的字符串数组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。