【續(xù)】iOS 面試題(八):實(shí)現(xiàn)一個(gè)嵌套數(shù)組的迭代器

昨天我的代碼,有一個(gè) Bug,就是我沒有處理好嵌套的數(shù)組元素為空的情況,我寫了一個(gè)簡單的 TestCase,大家也可以試試自己的代碼是否處理好了這種情況:

- (void)testEmptyArray {

NSArray *arr = @[ @[ @[ ]], @[@[ @[ @[ ]]]]];

NSArrayIterator *c =[[NSArrayIterator alloc]initWithArray:arr];

XCTAssertEqualObjects(nil,[c next]);

XCTAssertEqualObjects(nil,[c next]);

}

于是乎,我發(fā)現(xiàn)我的代碼可以再優(yōu)化一下,用遞歸的方式來處理空數(shù)組的邏輯似乎是寫起來更簡單的,于是我優(yōu)化之后的邏輯如下:

判斷棧是否為空,如果為空則返回 nil。

從棧中取出元素,看是否遍歷到了結(jié)尾,如果是的話,則出棧。

判斷第 2 步是否使棧為空,如果為空,則返回 nil。

終于拿到元素了,這一步判斷拿到的元素是否是數(shù)組。

如果是數(shù)組,則重新生成一個(gè)遍歷的 NSArrayIteratorCursor 對象,放到棧中,并且遞歸調(diào)用自己。

如果不是數(shù)組,就把元素返回,同時(shí)更新索引到下一個(gè)位置。

整個(gè)代碼也變得更短更清楚了一些,如下所示:

next 方法的實(shí)現(xiàn):

- (id)next {

//? 1. 判斷棧是否為空,如果為空則返回 nil。

if(_stack.count==0) {

return ?nil;

}

// 2. 從棧中取出元素,看是否遍歷到了結(jié)尾,如果是的話,則出棧。

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) {

returnnil;

}

// 4. 終于拿到元素了,這一步判斷拿到的元素是否是數(shù)組。

id item =c.array[c.index];

if([item isKindOfClass:[NSArrayclass]]){

c.index++;

// 5. 如果是數(shù)組,則重新生成一個(gè)遍歷的

//? ? NSArrayIteratorCursor 對象,放到棧中, 然后遞歸調(diào)用 next 方法

[self setupStackWithArray:item];

return[self next];

}

// 6. 如果到了這一步,說明拿到了一個(gè)非數(shù)組的元素,這樣就可以把元素返回,

//? ? 同時(shí)更新索引到下一個(gè)位置。

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

}


}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容