2014-08-28 133 views
4

我一直在研究搜索算法整个下午,我想一些意见。我正在做的一些特定的iOS,但一般的概念不是。我想显示一组数据,一个目录。在目录中我有部门和人员。我知道这听起来像是一本教科书的例子,听我说。我保证,这不是功课。 (我可以提供我正在工作的屏幕截图。)快速搜索和排序

我有一个条目数组,其中有两种目录条目。我需要按名称对条目进行排序,然后将数组拆分为更小的数组,其中每个子数组包含以相同字母开头的条目。

此外,我需要考虑用户可能输入的搜索字符串。

我一般的过程是这样的:

  1. 过滤所有,如果有一个匹配的类型和搜索字符串的条目。对于此步骤,我使用NSPredicate:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %i AND searchableContents B[cd] %@", type, searchString]; 
    
    if (!searchString || searchString.length == 0) 
    { 
        predicate = [NSPredicate predicateWithFormat:@"type == %i", type]; 
    } 
    
    NSArray *array = [_directoryContents filteredArrayUsingPredicate:predicate]; 
    
  2. 按字母顺序排序结果。

    array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
        return [((BRKDirectoryEntry *)obj1).comperableTitle compare:((BRKDirectoryEntry *)obj2).comperableTitle]; 
    }]; 
    
  3. 将结果分解为更小的数组。对于表演,如果我们搜索,我会跳过这一步,但它似乎没有帮助。

    if(alphabetized) 
    { 
        array = [self _alphabetizedArrayFromPresortedArray:array]; 
    } 
    

的本上共有950项的性能是深不可测的。

现在,对于我的默认显示,我可以简单地将已排序的数据缓存在内存中,然后显示和滚动执行得很好,但对于search-as-I类型,根本无法实现平滑用户期望的性能。

任何指针或提示?

+2

我仍然对有多少人问“我正在做XYZ,它太慢了,我怎么能让它更快?好像其他人的猜测有很大的机会。有一种瑞士军刀不能输的方法。 [*让程序本身告诉你答案。*](http://stackoverflow.com/a/378024/23771)这里是一个[*简短的例子*](http://stackoverflow.com/a/4299378/23771 )(在Python中,但你会明白)。 – 2014-08-29 00:21:27

+0

只是一个小提示:使用谓词比快速枚举慢得多,如下所示:https://www.objc.io/issues/7-foundation/collections/(部分**枚举和高阶消息传递**) ,我想你可以简化这行代码 如果(!搜索字符串|| searchString.length == 0) 到 如果(!searchString.length) – Duc 2015-12-19 00:26:41

回答

1

是的。忘记文件并将其保存在数据库中。创建索引一切都变成了一个简单的SQL语句。