Ios 筛选/搜索NSMutableDictionary

Ios 筛选/搜索NSMutableDictionary,ios,objective-c,uisearchbar,nspredicate,nsmutabledictionary,Ios,Objective C,Uisearchbar,Nspredicate,Nsmutabledictionary,我有一个NSMutableDictionary(PerosnsListSections)和一个名为Persons的类 NSMutableDictionary: 钥匙是像“a,b,m…”这样的字母 值是NSMutableArray ->NSMutableArray具有类Persons的对象 人员类别: @属性(赋值,非原子)NSInteger pid; @属性(强,非原子)NSString*名称 现在我在UITableView中显示了PerosnSlitSections,如图所示 我想实现的

我有一个NSMutableDictionary(PerosnsListSections)和一个名为Persons的类

NSMutableDictionary:

  • 钥匙是像“a,b,m…”这样的字母
  • 值是NSMutableArray ->NSMutableArray具有类Persons的对象
人员类别: @属性(赋值,非原子)NSInteger pid; @属性(强,非原子)NSString*名称

现在我在UITableView中显示了PerosnSlitSections,如图所示

我想实现的是,当用户在搜索栏中键入时,首先我必须过滤第一个字母的部分,然后过滤该部分下的名称


对不起,我的英语不好(:

您可以先通过以下操作在字典中选择正确的数组:

NSString *firstLetter = [searchString substringWithRange:(NSRange){0,1}];
NSArray *people = PersonsListSection[firstLetter];
然后,您可以使用以下方法筛选人员:

但是,如何在tableview的内容中反映这一点是另一个问题

  • 通常,您希望视图控制器成为UISearchBar的委托,并使用
    –(void)searchBar:textDidChange:
    委托方法对更改做出反应
  • 在那里,您可以调用tableview的
    -reloadData
    方法,以便它尝试重新计算其内容,调用其所有数据源方法,如
    -numberOfSectionsInTableView:
    等等
  • 在这些方法中,您需要检查搜索栏中是否输入了某些文本,并使用上述提示返回正确的部分/单元格

  • 同样,最好使用数组而不是字典,这样就可以在O(1)中处理它的内容:NSArray*people=PersonListSection[firstLetterCharacter-'a']。NSDictionaries用于查找,因此平均查找时间为O(1),最坏的情况是O(log n)因此,您不会有太大的松动。此外,使用数组意味着预分配尽可能多的子数组,因为可以有不同的首字母。字典仍然包含25个数组,每个字母一个,因此这并不意味着浪费更多内存。而且,对于每个以不同字母开头的单词,哈希值很可能会不同,但事实并非如此这是一个实现细节,也可能有25个不同字母的单词被放在同一个字典桶中。我想说的是,它们的哈希函数不太可能不具有基本的一致性属性,因此接近的数字(从A到Z的字母)同样,对于字典,您只需要分配您需要的名称,因此如果您只有一个名称要存储,那么您只能有一个数组-这可以工作(字典中的未命中返回零,而数组中的未命中抛出异常)。它也可以演变为与拉丁语不同的字母表一起使用。明白了,我创建了一个本地(filteredPeople)数组,从原始(PersonListSection)数组加载。这个本地数组就是视图中显示的数组。在搜索中,我过滤原始数组(PersonListSection)并将结果保存在(filteredPeople)中然后重新加载tableview(:注意,在一行或两行中有几种不同的方式“过滤”一个你想要的数组。但是这些通常不会比简单地写出明显的循环快,而且在很多情况下,它们会慢很多。写出你理解的循环和使用你读过但并不真正理解的神秘函数没有什么区别。
    NSPredicate *namesBeginningWithKeyword = [NSPredicate predicateWithFormat:@"(name     BEGINSWITH[cd] $letter)"];
    NSArray *filteredPeople = [people filteredArrayUsingPredicate:[namesBeginningWithKeyword predicateWithSubstitutionVariables:@{@"letter": searchString}]]);