《黑马程序员》 NSSet类型 以及与NSArray区别(Objective - c语法)

NSSet类型 以及与NSArray区别

 

NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合; NSSet  , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray,NSDictionary(都是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的;


        NSSet和我们常用NSArry区别是:在搜索一个一个元素时NSSet比NSArray效率高,主要是它用到了一个算法hash(散列,也可直译为哈希);开发文档中这样解释:You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing whether an object is contained in the set is a consideration—while arrays are ordered, testing for membership is slower than with sets.

比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了;


       NSSet,NSArray都是类,只能添加cocoa对象,如果需要加入基本数据类型(int,float,BOOL,double等),需要将数据封装成NSNumber类型。

 例:

 

#import <Foundation/Foundation.h> int main(int argc, const char * argv[])
 {   
  @autoreleasepool {  
        //集合的特点  
        //1.集合是无序的      
        //2.集合中的元素都是互异的,不可以重复,如果有重复的元素,则识别为一个元素        
        //1.创建一个NSSet对象  
   
    NSSet *set = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", @"aa", nil];  
  
     NSLog(@"set: %@", set);  
    
   //2.求集合元素个数      

     NSUInteger count = [set count];    
     NSLog(@"count = %lu", count); 
       
     //3.获得集合的元素      
     //(1)获得全部元素 
  
      NSArray *members = [set allObjects];    
      NSLog(@"%@", members);
     
   //(2)获得单一元素      
   //anyObject随意取一个元素     
     NSString *str1 = [set anyObject];     
     NSString *str2 = [set anyObject];    
     NSString *str3 = [set anyObject];   
     NSString *str4 = [set anyObject]; 
   
     NSLog(@"str = %@,%@,%@,%@", str1, str2, str3, str4);    
  
      //4.判断集合中是否包含某个对象。    
     BOOL have = [set containsObject:@"cc"];     
     NSLog(@"have = %d", have);  
        
     //NSMutableSet     
     //1.创建一个NSMutableSet对象   
      NSMutableSet *mSet = [[NSMutableSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"cc", @"dd", nil]; 

      //2.添加@"ff"到mSet集合中    
     [mSet addObject:@"ff"];    
     NSLog(@"mSet = %@", mSet); 
    
    //3.移除掉@"cc"       
    [mSet removeObject:@"cc"];     
    NSLog(@"remove:%@", mSet); 
              
     //NSCountedSet    
     NSCountedSet *cSet = [[NSCountedSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"cc", @"dd", @"cc", @"dd", nil]; 
    
     NSLog(@"cSet:%@", cSet); 
   
     //移除@"cc",      
   //removeObject: 对于NSCountedSet对象而言,移除只能移除一个对象,而对于NSMutableSet而言,移除会将所有相同的对象全部移除。   
      [cSet removeObject:@"cc"];    
     NSLog(@"remove:%@", cSet);  
   
    //添加@"ff"     
    //addObject:对于NSCountedSet对象而言,添加对象会增加对象在集合中出现的次数,而对于NSMutableSet而言,如果添加的对象已经存在于集合中,则不会再添加。   
    [cSet addObject:@"ff"];     
    [cSet addObject:@"dd"];     
    NSLog(@"add:%@", cSet);    
      
     //获得某个对象在集合中出现的次数     
    NSUInteger countInSet = [cSet countForObject:@"dd"];   
     NSLog(@"count = %lu", countInSet); 
       
     //快速遍历(快速枚举)      
   for (NSString *element in mSet) 
   {           
   
      NSLog(@"%@", element); 
    
    }     
    
   }   
  return 0; 
}

 

posted @ 2015-03-31 14:49  画梦醉红尘  阅读(192)  评论(0编辑  收藏  举报