經常會遇到兩個數組去對比然后進行去重的計算,看了網上很多文章,都是簡單的兩個數組的情況,很少有介紹兩個模型數組的去重,於是自己寫一點自己的經驗吧。
首先准備一個模型對象,這里以Person為例,對象擁有name屬性:
@interface Person : NSObject /** 姓名 */ @property(nonatomic, copy) NSString *name; @end
然后分別准備兩個模型數組,存放一些模型數據:
NSMutableArray *arr_1 = [NSMutableArray array]; for (NSInteger i = 0; i < 1000; i++) { Person *p = [[Person alloc] init]; p.name = [NSString stringWithFormat:@"name_%zd", i]; [arr_1 addObject:p]; } NSMutableArray *arr_2 = [NSMutableArray array]; for (NSInteger i = 0; i < 1000; i++) { if (i % 2 == 0) { Person *p = [[Person alloc] init]; p.name = [NSString stringWithFormat:@"name_%zd", i]; [arr_2 addObject:p]; } }
這里為了讓計算效率更明顯,所以arr_1存放了1000個對象。
這里不推薦使用嵌套for循環,所以下面就沒有寫這種方法,當然也可以自行去驗證嵌套for循環的效率。
去重說明:在 arr_1 中去重 arr_2 中已有的對象
去重操作前提:將 arr_2 中的對象保存到一個字典中,這樣之后直接利用鍵值進行查找
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; for (Person *p in arr_2) { [dict setObject:p.name forKey:p.name]; }
去重方法一:使用數組的 enumerateObjectsUsingBlock: 方法對 arr_1 進行遍歷,將 arr_1 中並存在於 arr_2 中的對象刪除,去重結果保存在 arr_1 中;
CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent(); // 這里是運行三次的結果 // 計算時長 : 2.709031 ms // 計算時長 : 2.907991 ms // 計算時長 : 2.711058 ms [arr_1 enumerateObjectsUsingBlock:^(Person *p, NSUInteger idx, BOOL * _Nonnull stop) { NSString *name = [dict objectForKey:p.name]; if (name.length > 0) { [arr_1 removeObject:p]; } }]; CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime); NSLog(@"計算時長 : %f ms", linkTime *1000.0);
去重方法二:使用數組的 enumerateObjectsUsingBlock: 方法對 arr_1 進行遍歷,將 arr_1 中並存在於 arr_2 中的對象保存到新的數組中,去重結果保存在 newArr 中;
CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent(); // 這里是運行三次的結果 // 計算時長 : 0.548959 ms // 計算時長 : 0.308037 ms // 計算時長 : 0.313997 ms NSMutableArray *newArr = [NSMutableArray array]; [arr_1 enumerateObjectsUsingBlock:^(Person *p, NSUInteger idx, BOOL * _Nonnull stop) { NSString *name = [dict objectForKey:p.name]; if (name.length <= 0) { [newArr addObject:p]; } }]; CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime); NSLog(@"計算時長 : %f ms", linkTime *1000.0);
兩種方法的計算結果對比很明顯了,所以在遍歷時盡量不要去做刪除的操作。