我正在开发一个示例应用程序,其中,每次用户在搜索栏中输入任何字符时,我都必须根据输入的字符过滤200,000个NSArray元素的NSDictionaryNSDictionary仅包含两个键,即“ English”和“ Meaning”;

到目前为止,我正在UISearchBar delegate方法中按以下方式进行操作

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@",@"English",searchText];

    _searchResult = [_dictionaryData filteredArrayUsingPredicate:searchPredicate];
}


我觉得这不是执行此操作的正确方法,而且过滤也很费时间。

附言-我正在使用核心数据填充NSArray

最佳答案

如果您强调效率,则应该将给定的单词音译为仅由ASCII字符组成的某种“规范化”形式。将这些词保留在专用的NSArray或其他某种容器(例如std::vector)中。

搜索字符串必须以相同的方式音译。然后,搜索功能将非常有效,因为它只需要在给定单词中找到给定的搜索字符串作为子字符串即可。

您可以不使用谓词来实现搜索算法。最好不要使用NSArrayNSString,而应使用std::vector<std::string>,即C ++。

您可以通过在其他NSDictionary中进行查找来获得找到的(标准化的)单词的含义。

要将字符串转换为音译形式,可以查看以下参考资料:


[NSString] dataUsingEncoding:allowLossyConversion:
编码等于NSASCIIStingEncoding且allowLossyConversion设置为YES
[NSString] stringByFoldingWithOptions:locale:使用选项NSDiacriticInsensitiveSearch和(可能是)当前语言环境。
CFStringTransform()

关于ios - 如何有效过滤大约200,000个NSDictionaries的NSArray?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21017457/

10-14 21:09