Ios 快速搜索和排序

Ios 快速搜索和排序,ios,objective-c,arrays,performance,sorting,Ios,Objective C,Arrays,Performance,Sorting,我整个下午都在研究一个搜索算法,我想听听大家的意见。我所做的一些工作是针对iOS的,但一般概念并非如此 我试图显示一组数据,一个目录。在目录中我有部门和人员。我知道这听起来像教科书上的例子,听我说。这不是家庭作业,我保证。(我可以提供我正在进行的工作的屏幕截图。) 我有一个条目数组,其中有两种目录条目。我需要按名称对条目进行排序,然后将数组分成更小的数组,其中每个子数组包含以相同字母开头的条目 此外,我需要说明用户可以输入的搜索字符串 我的一般过程是: 筛选与类型和搜索字符串匹配的所有条目(如果

我整个下午都在研究一个搜索算法,我想听听大家的意见。我所做的一些工作是针对iOS的,但一般概念并非如此

我试图显示一组数据,一个目录。在目录中我有部门和人员。我知道这听起来像教科书上的例子,听我说。这不是家庭作业,我保证。(我可以提供我正在进行的工作的屏幕截图。)

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

此外,我需要说明用户可以输入的搜索字符串

我的一般过程是:

  • 筛选与类型和搜索字符串匹配的所有条目(如果有)。对于此步骤,我使用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];
    
  • 按字母顺序对结果排序

    array  = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [((BRKDirectoryEntry *)obj1).comperableTitle compare:((BRKDirectoryEntry *)obj2).comperableTitle];
    }];
    
  • 将结果分成更小的数组。为了提高性能,如果我们正在搜索,我会跳过这一步,但这似乎没有帮助

    if(alphabetized)
    {
        array = [self _alphabetizedArrayFromPresortedArray:array];
    }
    
  • 在总共950个条目上的表现是糟糕透顶的

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


    有什么提示吗?

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

    我仍然惊讶于有多少人问“我在做XYZ,它太慢了。我怎样才能让它更快?”好像其他人的猜测有很大的机会。有一种瑞士军刀不能丢的方法。这里有一个(在python中,但你会明白的)。只是一个小提示:使用谓词比这里所示的快速枚举慢得多:(节枚举和高阶消息传递),我认为如果(!searchString | | searchString.length==0)到if(!searchString.length),可以简化这行代码