MST

星途 面试题库

面试题:Objective-C快速枚举在复杂数据结构中的应用

假设有一个嵌套的NSArray,内部数组又包含了NSDictionary对象,每个NSDictionary对象包含多个键值对,其中一个键为 "name" 对应的值为NSString类型的名称。请使用快速枚举遍历这个复杂数据结构,找出所有名称以字母 'A' 开头的对象,并将这些对象组成一个新的NSArray返回,同时阐述在这种复杂结构下快速枚举可能会遇到的问题及解决方案。
28.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

代码实现

NSArray *nestedArray = @[
    @[
        @{@"name":@"Apple", @"otherKey":@"value1"},
        @{@"name":@"Banana", @"otherKey":@"value2"}
    ],
    @[
        @{@"name":@"Avocado", @"otherKey":@"value3"},
        @{@"name":@"Cherry", @"otherKey":@"value4"}
    ]
];

NSMutableArray *resultArray = [NSMutableArray array];
for (NSArray *subArray in nestedArray) {
    for (NSDictionary *dict in subArray) {
        NSString *name = dict[@"name"];
        if ([name hasPrefix:@"A"]) {
            [resultArray addObject:dict];
        }
    }
}
NSArray *finalResult = [NSArray arrayWithArray:resultArray];
return finalResult;

可能遇到的问题及解决方案

  1. 空指针问题:如果嵌套的NSArray或内部的NSDictionary中存在nil值,在快速枚举时访问nil对象会导致程序崩溃。
    • 解决方案:在访问对象前进行判空操作,例如:
if (subArray && [subArray isKindOfClass:[NSArray class]]) {
    for (NSDictionary *dict in subArray) {
        if (dict && [dict isKindOfClass:[NSDictionary class]]) {
            NSString *name = dict[@"name"];
            if (name && [name hasPrefix:@"A"]) {
                [resultArray addObject:dict];
            }
        }
    }
}
  1. 数据类型不匹配问题:如果nestedArray中的元素不是预期的NSArray类型,或者内部数组中的元素不是预期的NSDictionary类型,会导致程序逻辑错误。
    • 解决方案:在使用前进行类型检查,如上述代码中通过isKindOfClass:方法检查类型,确保操作的对象是预期类型。
  2. 性能问题:对于非常大的嵌套数据结构,多层嵌套的快速枚举可能会导致性能下降。
    • 解决方案:可以考虑使用更高效的数据结构或者算法,例如如果数据结构允许,可以将数据扁平化处理,减少嵌套层数,从而减少循环次数,提高性能。同时,如果数据量过大,可以考虑分页加载等策略。