使用NSDictionary将索引存储为值,可以更快地进行NSArray查找

ind*_*roy 3 objective-c nsdictionary nsarray ios data-structures

可以说我有一个学生课程如下:

class Student {
    NSNumber *id;
    NSString *lastName;
    NSString *firstName; 
}
Run Code Online (Sandbox Code Playgroud)

现在,当我从Web服务中获取所有学生的记录时,我有一个NSArray,可以存储所有学生的记录.在某些时候,我需要查找数组,根据名字查找特定学生的记录.

假设我创建了一个名为studentsFirstNameDictionary的字典.

因此,在向学生阵列添加对象时,我可以这样做

Student objStudent = [[Student alloc] init];
objStudent.Id = someId;
objStudent.firstName = someName;
objStudent.lastName = someLastName;
[studentsDictionary setValue:iterationCounter forKey:objStudent.firstName];
[students addObject:objStudent];
Run Code Online (Sandbox Code Playgroud)

我想知道创建这个字典是否是一个好主意,以加快查找速度,如下所示.另外请假设在任何情况下都需要数组,并且为了快速查找,我还创建了其他字典,并将姓氏和id作为键和索引存储为上述值:

-(Student*)getStudentByFirstName:(NSString *)firstName {
  int idxOfStudent = [ studentsDictionary valueForKey:firstName];
  return [students idxOfStudent];
}
Run Code Online (Sandbox Code Playgroud)

您是否认为这种方法比通过迭代学生数组并比较名字并返回匹配的学生记录更好?

我总是需要学生数组,因为我需要用该数组填充表视图.我想知道在填充数组时创建多个词典是否明智,以便我可以通过拳头名,姓或Id更快地查找学生记录?

PS:为了简单起见,考虑到所有的学生都有独特的姓,名和ID,因此不会有任何问题,同时创造字典存储姓氏,名字或ID作为值.

ric*_*ter 10

这听起来比它需要的更复杂.一般来说,在可可,如果你发现自己咨询了数据结构课本这个共同的任务,任你错过了什么在基金会的文档,或者你过早优化.

给定一组Student对象,至少有一些快速简便的方法可以获得具有唯一属性的对象:

使用块测试:

NSUInteger index = [studentArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj.firstName isEqualToString:desiredFirstName]) {
        *stop = YES;  // keeps us from returning multiple students with same name
        return YES;
    } else
        return NO;
}];
if (index != NSNotFound)
    Student *desiredStudent = [studentArray objectAtIndex:index];
Run Code Online (Sandbox Code Playgroud)

使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstName LIKE %@", desiredFirstName];
NSArray *filteredArray = [studentArray filteredArrayUsingPredicate:predicate];
Student *desiredStudent = [lastObject]; // only object if we assume firstNames are unique
Run Code Online (Sandbox Code Playgroud)

这两个都假设您的Student类已为这些字段声明了属性(或KVC兼容访问器)(即,不仅仅是实例变量).

如果您发现自己经常按名称访问学生,您可能需要考虑将名称映射到Student对象的字典:

NSMutableDictionary *studentsByName = [NSMutableDictionary dictionaryWithCapacity:[students count]];
for (Student *student in students)
    [studentsByName setObject:student forKey:[student firstName]];
Run Code Online (Sandbox Code Playgroud)

如果您有大量学生并希望按各种属性进行搜索,您可以考虑学习核心数据.