gpt4 book ai didi

objective-c - 使用 NSDictionary 将索引存储为值来加快 NSArray 查找

转载 作者:可可西里 更新时间:2023-11-01 06:21:10 26 4
gpt4 key购买 nike

假设我有一个 Student 类,如下所示:

class Student {
NSNumber *id;
NSString *lastName;
NSString *firstName;
}

现在,当我从 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];

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

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

您认为这种方法在性能方面是否比必须遍历学生数组并比较名字并返回匹配的学生记录更好?

我总是需要学生数组,因为我需要用该数组填充 TableView 。我想知道在填充数组时创建多个词典是否明智,以便我可以通过名字、姓氏或 ID 更快地查找学生记录?

P.S.:为了简单起见,假设所有学生都有唯一的名字、姓氏和 ID,因此在创建将名字、姓氏或 ID 作为值存储的字典时不会有任何问题。

最佳答案

这听起来比实际需要的要复杂。一般来说,在 Cocoa 中,如果您发现自己正在为这个常见任务查阅数据结构教科书,那么您要么错过了 Foundation docs 中的内容。或者你是 optimizing prematurely .

给定一组 Student 对象,至少有几种快速简便的方法来获取具有唯一属性的对象:

使用 block 测试:

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];

使用谓词:

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

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

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

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

如果你的学生人数非常多,并且想通过各种属性来搜索他们,你可以考虑学习 Core Data。

关于objective-c - 使用 NSDictionary 将索引存储为值来加快 NSArray 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10149049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com