【续】iOS 面试题(八):实现一个嵌套数组的迭代器
2018-03-07 21:18
253 查看
昨天我的代码,有一个 Bug,就是我没有处理好嵌套的数组元素为空的情况,我写了一个简单的 TestCase,大家也可以试试自己的代码是否处理好了这种情况:
从栈中取出元素,看是否遍历到了结尾,如果是的话,则出栈。
判断第 2 步是否使栈为空,如果为空,则返回 nil。
终于拿到元素了,这一步判断拿到的元素是否是数组。如果是数组,则重新生成一个遍历的 NSArrayIteratorCursor 对象,放到栈中,并且递归调用自己。
如果不是数组,就把元素返回,同时更新索引到下一个位置。
整个代码也变得更短更清楚了一些,如下所示:next 方法的实现:
- (void)testEmptyArray { NSArray *arr = @[ @[ @[ ]], @[@[ @[ @[ ]]]]]; NSArrayIterator *c = [[NSArrayIterator alloc] initWithArray:arr]; XCTAssertEqualObjects(nil, [c next]); XCTAssertEqualObjects(nil, [c next]); }于是乎,我发现我的代码可以再优化一下,用递归的方式来处理空数组的逻辑似乎是写起来更简单的,于是我优化之后的逻辑如下:判断栈是否为空,如果为空则返回 nil。
从栈中取出元素,看是否遍历到了结尾,如果是的话,则出栈。
判断第 2 步是否使栈为空,如果为空,则返回 nil。
终于拿到元素了,这一步判断拿到的元素是否是数组。如果是数组,则重新生成一个遍历的 NSArrayIteratorCursor 对象,放到栈中,并且递归调用自己。
如果不是数组,就把元素返回,同时更新索引到下一个位置。
整个代码也变得更短更清楚了一些,如下所示:next 方法的实现:
- (id)next { // 1. 判断栈是否为空,如果为空则返回 nil。 if (_stack.count == 0) { return nil; } // 2. 从栈中取出元素,看是否遍历到了结尾,如果是的话,则出栈。 NSArrayIteratorCursor *c; c = [_stack lastObject]; while (c.index == c.array.count && _stack.count > 0) { [_stack removeLastObject]; c = [_stack lastObject]; } // 3. 判断第2步是否使栈为空,如果为空,则返回 nil。 if (_stack.count == 0) { return nil; } // 4. 终于拿到元素了,这一步判断拿到的元素是否是数组。 id item = c.array[c.index]; if ([item isKindOfClass:[NSArray class]]) { c.index++; // 5. 如果是数组,则重新生成一个遍历的 // NSArrayIteratorCursor 对象,放到栈中, 然后递归调用 next 方法 [self setupStackWithArray:item]; return [self next]; } // 6. 如果到了这一步,说明拿到了一个非数组的元素,这样就可以把元素返回, // 同时更新索引到下一个位置。 c.index++; return item; }初使化部分:
- (id)initWithArray:(NSArray *)array { self = [super init]; if (self) { _originArray = array; _stack = [NSMutableArray array]; [self setupStackWithArray:array]; } return self; } - (void)setupStackWithArray:(NSArray *)array { NSArrayIteratorCursor *c = [[NSArrayIteratorCursor alloc] initWithArray:array]; [_stack addObject:c]; }感谢读者 @狒狒 的指正!代码和 TestCase 也已经更新到 gist 上了:https://gist.github.com/tangqiaoboy/452e106e0472b9e90cf17de180b6d211
相关文章推荐
- iOS 面试题(八):实现一个嵌套数组的迭代器
- 实现一个嵌套数组的迭代器
- Cocoa Core Competencies 的Object creation 和IOS面试题示例:写一个NSString类的实现
- js 数组实现一个类似ruby的迭代器
- 面试题:一个数组实现两个栈
- Cocoa Core Competencies 的Object creation 和IOS面试题示例:写一个NSString类的实现
- 【面试题】有一个整数数组,求指定连续N个的和最大的子数组,PHP实现。
- 对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解
- 面试题:实现在一个长度为255的数组,为数组中每一项填入1-255之间的数并且保证不重复
- 栈和队列面试题(一)---一个数组实现两个栈
- js 数组实现一个类似ruby的迭代器
- iOS 多个线程对数组操作(遍历,插入,删除),实现一个线程安全的NSMutabeArray
- 一个数组实现两个栈——栈和队列面试题(5)
- 面试题:实现在一个长度为255的数组,为数组中每一项填入0-255之间的数并且保证不重复
- Cocoa Core Competencies 的Object creation 和IOS面试题示例:写一个NSString类的实现
- 面试题,求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)
- 面试题之两个栈实现一个队列,乘机数组问题
- 前端攻城狮学习笔记一:实现一个遍历数组或对象里所有成员的迭代器
- 给js的数组实现一个类似ruby的迭代器