iOS NSSet 學習 “無序數組” & 去重 案例


NSSet,NSMutableSet,NSCountedSet類聲明編程接口對象的無序集合(散列存儲:在內存中的存儲位置不連續)。

而NSArray,NSDictionary類聲明編程接口對象的有序集合(有序存儲:在內存中的存儲位置連續)。”

NSSet 運用 hash(哈希)散列算法 查找目標集合元素比NSArray快

特點:無序性(但是可以做有序化操作),確定性,差異性(互異性) 

舉例一個簡單的使用場景:

去重:

NSMutableArray KVO  NSMutableArray NSSet  NSOrderedSet 各種方法 比較

結論:隨着數據量增加 都比 NSMutableArray 快~

    NSArray *array = @[@1,@2,@3,@4,@4,@5,@2,@2];
    
    //NSMatableArray 去重結果: 1 2 3 4 5  有序 在 array 里面相對的順序的"有序"
    NSMutableArray *resultArray = [NSMutableArray array];
    for (NSNumber *num  in array) {
        if (![resultArray containsObject:num]) {//判斷該集合元素否存在
            [resultArray addObject:num];
        }
    }
    NSLog(@"resultArray :%@",resultArray);
    
    //KVC容器操作
    //容器不僅僅能使用KVC方法實現對容器成員傳遞普通的操作消息,KVC還定義了特殊的一些常用操作,使用valueForKeyPath:結合操作符來使用
    //這里使用對象操作符:
    //@distinctUnionOfObjects、@unionOfObjects
    //@distinctUnionOfObjects操作符返回被操作對象指定屬性的集合並做去重操作,而@unionOfObjects則允許重復。如果其中任何涉及的對象為nil,則拋出異常。
    //去重結果  : 5 1 2 3 4 無序
    NSArray *values = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"value   : %@",values);
 
    
    //沒使用 NSSet 前 其實我是會使用字典的 字典的特點 也是無序鍵值對 效率也是優於使用數組排重的.
    //無序結果  :3,2,5,1,4
    NSMutableDictionary *numDictionary = [NSMutableDictionary dictionary];
    for (NSNumber *num  in array) {
        [numDictionary setObject:num forKey:num];
    }
    NSLog(@"numDictionary all keys : %@",numDictionary.allKeys);
    
    
    //NSSet 去重結果  : 5 1 2 3 4  無序
    NSSet *numSet = [[NSSet alloc]initWithArray:array];
    NSLog(@"numSet Array : %@",numSet.allObjects);
    
    //NSSet 有序化操作 : 1 2 3 4 5 同上面的"有序"
    NSOrderedSet *orderNumSet = [NSOrderedSet orderedSetWithArray:array];
    NSLog(@"orderNumSet Array : %@",orderNumSet.array);
    
    //KVO 容器對象操作符 distinctUnionOfObjects
    //3,2,5,1,4  無序
    
    NSSet *setValues = [numSet valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"setValues  : %@",setValues);

 

NSSet 具體使用 :

http://www.cnblogs.com/GISerYang/p/3340937.html


免責聲明!

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



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