gpt4 book ai didi

ios - 在字典数组中搜索字符串数组

转载 作者:可可西里 更新时间:2023-11-01 05:43:58 24 4
gpt4 key购买 nike

我有一个组合数组,需要在另一个字典数组中搜索

字典数组如下:

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

Array Of Combinations 如下: array named as

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: 方法可能有助于加快搜索速度。

假设你有一个键数组和一个源数组,你想用键数组过滤源数组。

NSArray *keysArray = @[@"1",@"2",@"3"];    
NSArray *sourceArray = @[@"12",@"2",@"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左右,内存分配少了一点。我建议您将较大的数据源拆分为较小的 block 以使用较少的内存。

关于ios - 在字典数组中搜索字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28980951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com