实现一个嵌套数组的迭代器
来源:互联网 发布:加密软件 dg 编辑:程序博客网 时间:2024/06/06 04:02
昨天我的代码,有一个 Bug,就是我没有处理好嵌套的数组元素为空的情况,我写了一个简单的 TestCase,大家也可以试试自己的代码是否处理好了这种情况:
- (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
0 0
- 实现一个嵌套数组的迭代器
- 一个关于中国省市区的字典,数组嵌套使用
- 17、实现一个简单的ArrayList类,以及静态嵌套类实现迭代器
- 使用字典和数组的嵌套实现通讯录
- thinkphp5 volist 嵌套 实现多维数组的table
- C#一个数组的实现
- 一个数组队列的实现
- Android NestedScrolling帮你实现一个简单的嵌套滑动
- 给js的数组实现一个类似ruby的迭代器
- 数组字典的嵌套使用
- CDATA嵌套 的实现
- CDATA嵌套 的实现
- [C++]vector嵌套实现2D数组
- C++容器嵌套实现动态二维数组
- PHP100-6 编写一个函数解析多重嵌套数组的所有元素
- 一个动态多维数组的实现
- 需要一个1000000的数组实现方法
- 一个静态数组实现的简单栈
- SpringMVC 修炼手册 part3 控制器拦截与请求参数
- (0)FPGA自学之路-笔记0
- qqqqq
- typedef void (*pFunction)(void);
- Java数据结构--线性表
- 实现一个嵌套数组的迭代器
- a标签的带参传值和form表单的带参
- 最简单的走马灯实现
- MapReduce多种输入格式
- Java Web项目中解决中文乱码方法总结
- ThinkPHP+predis 环境配置
- Linux文件系统管理(二)
- xml全解析
- web