我当前的数组如下所示。我为sectionIndex表创建这个数组格式。所以我可以从数组中搜索并使用索引表显示搜索文本。
arrContent = (
{
key = A;
value = (
Ac,
Acting
);
},
{
key = B;
value = (
Basketball,
Baseball
);
},
{
key = C;
value = (
Cat
);
}
{
key = P;
value = (
Panda,
Peacock
);
}
)
我的搜索代码如下所示。它工作正常。
-(void)searchText:(NSString *) text
{
[arrSearch removeAllObjects];
for (int i = 0; i < [arrContent count]; i++)
{
NSMutableArray *temp = [[NSMutableArray alloc]init];
NSMutableArray *arrFind = arrContent[i][@"value"];
for (int j = 0; j < [arrFind count]; j++)
{
NSString *str = arrFind[j];
// containsString: method find my string if its available within range
if ([str containsString:text])
[temp addObject:str];
}
if ([temp count])
{
[arrSearch addObject:@{@"key":arrContent[i][@"key"],@"value":temp}];
}
}
NSLog(@"Search : %@",text);
NSLog(@"arrSearch : %@",arrSearch);
}
我的输出如下。这是正确的。
Search : ac
arrSearch : (
{
key = A;
value = (
Ac,
Acting
);
},
{
key = P;
value = (
Peacock
);
}
)
我只是想问一下,如果有更好的方法来搜索并使用 NSPredicate 获得相同的输出,因为for循环会花费大量数据时间。
帮助会受到影响。
答案 0 :(得分:1)
您可以像NSArray一样使用内置函数......
- (NSArray *)filterArrayUsingText:(NSString *)text
{
NSMutableArray *filteredWordArray = [NSMutableArray array];
for (NSDictionary *dictionary in yourWordArray) {
NSArray *filteredWords = [self filterWordsFromArray:dictionary[@"value"] usingText:text];
if (filteredWords) {
[filteredWordArray addObject:@{@"key":dictionary[@"key"], @"value", filteredWords}];
}
}
return filteredWordArray;
}
- (NSArray *)filterWordsFromArray:(NSArray *)wordArray usingText:(NSString *)text
{
NSPredicate *predicate = [NSPredicate predicateWithBlock:^(NSString *theWord, NSDictionary *bindings) {
return [theWord containsString:text];
}];
NSArray *filteredArray = [wordArray filteredArrayUsingPredicate:predicate];
return filteredArray.count == 0 ? nil : filteredArray;
}
另外,请务必使用现代的Obj-C语法。
此外,数据的存储方式有点破碎。对于键/值对,您不能存储Key
和Value
。
你会这样存储......
{
A: (Ac,
Acting),
B: (Basketball,
Baseball),
C: (Cat),
P: (Panda,
Peacock)
}