iOS進階之兩個模型數組的去重方法


  經常會遇到兩個數組去對比然后進行去重的計算,看了網上很多文章,都是簡單的兩個數組的情況,很少有介紹兩個模型數組的去重,於是自己寫一點自己的經驗吧。

  首先准備一個模型對象,這里以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);

  兩種方法的計算結果對比很明顯了,所以在遍歷時盡量不要去做刪除的操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM