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

昨天我的代碼,有一個 Bug,就是我沒有處理好嵌套的數(shù)組元素為空的情況跃闹,我寫了一個簡單的 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ù)組衩椒,則重新生成一個遍歷的 NSArrayIteratorCursor 對象,放到棧中哮兰,并且遞歸調(diào)用自己毛萌。

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

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

next 方法的實現(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ù)組,則重新生成一個遍歷的

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

[self setupStackWithArray:item];

return[self next];

}

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

//? ? 同時更新索引到下一個位置活鹰。

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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市只估,隨后出現(xiàn)的幾起案子志群,更是在濱河造成了極大的恐慌,老刑警劉巖蛔钙,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌云,死亡現(xiàn)場離奇詭異,居然都是意外死亡吁脱,警方通過查閱死者的電腦和手機桑涎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門彬向,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攻冷,你說我怎么就攤上這事娃胆。” “怎么了等曼?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵里烦,是天一觀的道長。 經(jīng)常有香客問我禁谦,道長胁黑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任州泊,我火速辦了婚禮丧蘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拥诡。我一直安慰自己触趴,他們只是感情好氮发,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布渴肉。 她就那樣靜靜地躺著,像睡著了一般爽冕。 火紅的嫁衣襯著肌膚如雪仇祭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天颈畸,我揣著相機與錄音乌奇,去河邊找鬼。 笑死眯娱,一個胖子當著我的面吹牛礁苗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徙缴,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼试伙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了于样?” 一聲冷哼從身側(cè)響起疏叨,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穿剖,沒想到半個月后蚤蔓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡糊余,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年秀又,在試婚紗的時候發(fā)現(xiàn)自己被綠了单寂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吐辙,死狀恐怖凄贩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袱讹,我是刑警寧澤疲扎,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捷雕,受9級特大地震影響椒丧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜救巷,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一壶熏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浦译,春花似錦棒假、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叹俏,卻和暖如春妻枕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粘驰。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工屡谐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝌数。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓愕掏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顶伞。 傳聞我的和親對象是個殘疾皇子饵撑,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容