我当前的数组如下所示。我为 sectionIndex 表创建了这个数组格式。所以我可以从数组中搜索并使用索引表显示搜索文本。
arrContent = (
{
key = A;
value = (
Ac,
Acting
);
},
{
key = B;
value = (
Basketball,
Baseball
);
},
{
key = C;
value = (
Cat
);
}
{
key = P;
value = (
Panda,
Peacock
);
}
)
我的搜索代码如下所示。它工作正常。
-(void)searchTextNSString *) 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 循环会花费时间。
希望得到帮助。
Best Answer-推荐答案 strong>
你可以像这样使用 NSArray 的内置函数...
- (NSArray *)filterArrayUsingTextNSString *)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 *)filterWordsFromArrayNSArray *)wordArray usingTextNSString *)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)
}
关于ios - 使用 Predicate 从 NSArray 中搜索,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/25739083/
|