問題##
最近在工作中遇到一個比較有意思的問題,根據(jù)相關(guān)業(yè)務(wù)邏輯抽象后可以轉(zhuǎn)換為以下問題模型瞭亮。
現(xiàn)有一個初始化數(shù)組為array蝗茁,需要處理后的結(jié)果為result數(shù)組。
規(guī)則為:將值相同且個數(shù)大于1的元素(這些元素有一些相同的特征嫂易,如下例中的元素均以字母v開始,并且會連續(xù)出現(xiàn))添加到一個新數(shù)組中以替換原來的元素并要求最終數(shù)組的元素相對順序與原始數(shù)組一致掐禁。
array:{a,v1,v1,v4,v4,b,v2,v2,v5,v5,c,v3,v3}
result:{a,{v1,v1},{v4,v4},b,{v2,v2},{v5,v5},c,{v3,v3}}
思路##
需要解決該問題的關(guān)鍵是需要處理值相同的元素怜械,并需要保證這些元素的結(jié)果數(shù)組中的相對順序。要實現(xiàn)此目的需要將原始數(shù)組進行拆分處理傅事,將符合條件的值相同的元素保存在一個臨時數(shù)組中缕允,創(chuàng)建一個空的結(jié)果數(shù)組,在每次循環(huán)處理原始數(shù)組時將值相同的元素添加到臨時數(shù)組中蹭越,添加臨時數(shù)組和不重復(fù)元素到結(jié)果數(shù)組中障本,具體實現(xiàn)可以參考下面的OC代碼,其它語言實現(xiàn)方式類似响鹃。
代碼##
//初始化原始數(shù)組
NSMutableArray *originArray = [NSMutableArray array];
[originArray addObject:@"a"];
[originArray addObject:@"v1"];
[originArray addObject:@"v1"];
[originArray addObject:@"v4"];
[originArray addObject:@"v4"];
[originArray addObject:@"b"];
[originArray addObject:@"v2"];
[originArray addObject:@"v2"];
[originArray addObject:@"v5"];
[originArray addObject:@"v5"];
[originArray addObject:@"c"];
[originArray addObject:@"v3"];
[originArray addObject:@"v3"];
//結(jié)果數(shù)組
NSMutableArray *resultArray = [NSMutableArray array];
//臨時數(shù)組
NSMutableArray *tempArray = [NSMutableArray array];
for (NSString *item in originArray) {
if ([item hasPrefix:@"v"]){//是否有重復(fù)值
if (tempArray.count > 0) {
NSString *key = tempArray.lastObject;
if ([item isEqualToString:key]) {//值相同加入臨時數(shù)組
[tempArray addObject:item];
} else {//值不同加入結(jié)果數(shù)組并清空臨時數(shù)組
NSMutableArray *array = [NSMutableArray arrayWithArray:tempArray];
[resultArray addObject:array];
[tempArray removeAllObjects];
//將當前元素加入臨時數(shù)組
[tempArray addObject:item];
}
} else {
[tempArray addObject:item];
}
} else {//沒有重復(fù)值的元素
if (tempArray.count > 0) {
NSMutableArray *array = [NSMutableArray arrayWithArray:tempArray];
[resultArray addObject:array];
[tempArray removeAllObjects];
}
[resultArray addObject:item];
}
}
//將最后一組重復(fù)值加入結(jié)果數(shù)組
if (tempArray.count > 0){
[resultArray addObject:tempArray];
}
NSLog(@"result:%@",resultArray);
輸出結(jié)果: