通常来讲 两个数组 中找出一个有效的数组
就是两个for循环 外层循环i 内存循环 j 就可以把有效数据取出来了。
但是呢 我们公司的数据 有时候第一个数组就几千个 第二个数组也几千个
比如1000 *1000 就10 的6次方的计算次数了。
直接让计算机算 会非常耗时。
需求是:
我们的第一个数组 是由许多个 3秒一段的视频组成的
第二个数组是一个一个的时间节点,
要求 针对每个时间节点 前后15秒做判断,如果发现包含了第一个数组3秒一段的视频
就把视频抽出到新的数组里面
我的解决方案是两个时间排序。
第一个数组排序 第二个数组排序
排完顺序以后就开始遍历第一个数组
并取出第二个数组的第一项来对比,一旦对比到了,就添加进去,然后继续对比,
一直对比到超出了第二个数组的第一项的范围,就马上取第二个数组的下一项,
注意 如果第二个数组已经全取完了。
也直接结束掉,这样 整个过程只有一次循环 ,效率提升很大一个档次。
上代码 ,
注意一下,
我的第一个数组是正序的,第二个数组是倒序的,所以遍历是倒着来的。
进入条件就是在前后15秒范围内,跳出条件就是超过了前后15秒范围,当k <0代表第二个数组取完,(i + 1)> = jsonArray.count代表是最后一项了,不需要继续判断了也跳出,其余的部分是打印,和一些字典的转换`
- (void)getRedTsList:(NSArray *)sectionArr andJson:(NSArray *)jsonArray andComlpleteBlock:(void (^)(NSArray *object))completeblock{
NSLog(@"开始过滤");
NSMutableArray *redJsonArr = [NSMutableArray array];//结果数组
NSInteger k = sectionArr.count- 1;//标记第二个数组最后一项为k
for (NSInteger i=0; i<jsonArray.count; i++) {//遍历第一个数组
if (k<0) {//k<0 代表第二个数组已经取完了。
break;
}
NSDictionary *infoDic = jsonArray[i];//白色时间段
NSString *startTimeStr = infoDic[@"videoStartTime"];
NSString *endTimeStr = infoDic[@"videoEndTime"];
NSInteger starttime = [self formatTimeFormString:startTimeStr];
NSInteger endTime = [self formatTimeFormString:endTimeStr];//第一个数组的starttime 和endTime
NSDictionary *eventDic = sectionArr[k];//取出第二个数组第k项,
NSString *redTimeLabel = eventDic[@"eventOddurTime"];
NSInteger redTime = [self formatTimeFormString:redTimeLabel];//取出第k项的redtime
// NSLog(@"startTime = %@ %ld endTime = %@ %ld redTime = %@ %ld",startTimeStr,(long)starttime,endTimeStr,(long)endTime,redTimeLabel,(long)redTime);
if ((redTime- 15)< starttime && endTime< (redTime + 15) ) {//第一个数组的starttime 和endTime 在redtime 的前后15秒之内 就进入
[redJsonArr addObject:infoDic];//添加到结果数组
if ((i+1) >= jsonArray.count) {
break;
}//第一个数组到了最后一项 直接跳出
NSDictionary *infoDic1 = jsonArray[i+1];//白色时间段
NSString *startTimeStr1 = infoDic1[@"videoStartTime"];
NSString *endTimeStr1 = infoDic1[@"videoEndTime"];
NSInteger starttime1 = [self formatTimeFormString:startTimeStr1];
NSInteger endTime1 = [self formatTimeFormString:endTimeStr1];//第一个数组下一项的starttime 和endTime
// NSLog(@"startTime = %@ %ld endTime = %@ %ld redTime = %@ %ld 在前后15秒范围内 下一项的时间开始startTimeStr1 = %@ %ld 结束时间 endTimeStr1 = %@ %ld",startTimeStr,(long)starttime,endTimeStr,(long)endTime,redTimeLabel,(long)redTime,startTimeStr1,(long)starttime1,endTimeStr1,(long)endTime1);
if ((redTime+ 15) <= starttime1) {//第一个数组的starttime 和endTime 不在redtime 的前后15秒之内 就进入
k--;//k-- 就会在下次循环的时候取第二个数组的下一项了
}
if ((redTime+ 15) <= endTime1) {
k--;
}
}
}
NSLog(@"开始过滤 过滤结束");
completeblock(redJsonArr);
}