快速搜索和排序

时间:2014-08-28 23:47:26

标签: ios objective-c arrays performance sorting

我整个下午一直在研究搜索算法,我想要一些意见。我所做的一些特定于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];
    }
    
  4. 这对总共950个条目的表现非常糟糕。

    现在,对于我的默认显示,我可以简单地将已排序的数据缓存在内存中,然后显示和滚动效果很好,但对于I类搜索,根本没办法实现用户期望的流畅性能。

    任何指针或提示?

1 个答案:

答案 0 :(得分:1)

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