簡體   English   中英

使用NSDictionary將索引存儲為值,可以更快地進行NSArray查找

[英]Faster NSArray lookup using NSDictionary storing indices as values

可以說我有一個學生課程如下:

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

您是否認為這種方法比通過迭代學生數組並比較名字並返回匹配的學生記錄更好?

我總是需要學生數組,因為我需要用該數組填充表視圖。 我想知道在填充數組時創建多個詞典是否明智,以便我可以通過拳頭名,姓或Id更快地查找學生記錄?

PS:為簡單起見,請考慮所有學生都有唯一的名字,姓氏和ID,因此在創建將名字,姓氏或ID作為值存儲的詞典時不會出現任何問題。

這聽起來比它需要的更復雜。 通常在Cocoa中,如果你發現自己正在為這個常見的任務咨詢數據結構教科書,要么你錯過了基礎文檔中的某些內容,要么你過早地進行了優化

給定一組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];

使用謂詞:

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

如果您有大量學生並希望通過各種屬性進行搜索,您可以考慮學習核心數據。

我認為你根本不需要陣列。

創建學生對象:

Student objStudent = [[Student alloc] init];
objStudent.Id = someId;
objStudent.firstName = someName;
objStudent.lastName = someLastName;
[studentsDictionary setObject:student forKey:objStudent.firstName];

通過firstName查找學生:

Student * theStudent = [ studentsDictionary objectForKey:firstName ] ;

要從studentsDictionary獲取所有Student對象,請使用

NSArray * allStudents = [ studentsDictionary allValues ] ;

這假設你只會通過他們的firstName屬性找到學生。但是@ rickster的解決方案通常會更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM