问题##
最近在工作中遇到一个比较有意思的问题,根据相关业务逻辑抽象后可以转换为以下问题模型。
现有一个初始化数组为array,需要处理后的结果为result数组。
规则为:将值相同且个数大于1的元素(这些元素有一些相同的特征,如下例中的元素均以字母v开始,并且会连续出现)添加到一个新数组中以替换原来的元素并要求最终数组的元素相对顺序与原始数组一致。
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}}
思路##
需要解决该问题的关键是需要处理值相同的元素,并需要保证这些元素的结果数组中的相对顺序。要实现此目的需要将原始数组进行拆分处理,将符合条件的值相同的元素保存在一个临时数组中,创建一个空的结果数组,在每次循环处理原始数组时将值相同的元素添加到临时数组中,添加临时数组和不重复元素到结果数组中,具体实现可以参考下面的OC代码,其它语言实现方式类似。
代码##
//初始化原始数组
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"];
//结果数组
NSMutableArray *resultArray = [NSMutableArray array];
//临时数组
NSMutableArray *tempArray = [NSMutableArray array];
for (NSString *item in originArray) {
if ([item hasPrefix:@"v"]){//是否有重复值
if (tempArray.count > 0) {
NSString *key = tempArray.lastObject;
if ([item isEqualToString:key]) {//值相同加入临时数组
[tempArray addObject:item];
} else {//值不同加入结果数组并清空临时数组
NSMutableArray *array = [NSMutableArray arrayWithArray:tempArray];
[resultArray addObject:array];
[tempArray removeAllObjects];
//将当前元素加入临时数组
[tempArray addObject:item];
}
} else {
[tempArray addObject:item];
}
} else {//没有重复值的元素
if (tempArray.count > 0) {
NSMutableArray *array = [NSMutableArray arrayWithArray:tempArray];
[resultArray addObject:array];
[tempArray removeAllObjects];
}
[resultArray addObject:item];
}
}
//将最后一组重复值加入结果数组
if (tempArray.count > 0){
[resultArray addObject:tempArray];
}
NSLog(@"result:%@",resultArray);
输出结果: