【学习ios之路:Objective-C】字典.集合.

1.不可变数据字典(NSDicionary)

字典:用来存储具有一一对应关系的数据.
一个key 对应一个 value ,key起到了唯一标示的作用,key必须是唯一的,但是一个vlaue可以对应多个key.
字典存储的是无序的元素,一对键值对组成了字典中的一个元素.

①.不可变字典初始化赋值

//笑笑语法
  NSDictionary *dic = @{@"name":@"zhangdan",@"age":18,@"gender":@"man"};
  //初始化
  NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
                 @"放弃",@"abandon",@"对象",@"object",@"索引",@"index", nil];
  NSLog(@"%@",dictionary);
   //遍历构造器方法
  NSDictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:
                           @"xiaozang",@"name",@"18",@"age",@"23342432",@"phone",nil];
  NSLog(@"%@",dictionary1);


②.求字典元素个数,即获取所有的key和value
  //获取元素的个数 
  NSUInteger num = [dictionary1 count];
  NSLog(@"%ld",num);
   //获取所有的key
   for (NSString *temp in [dictionary1 allKeys] ) {
        NSLog(@"%@",temp);
     }
    NSArray  *array = [dictionary1 allKeys];
    NSLog(@"%@",array);
   //根据key获取对应的value
   NSString *value = [dictionary1 objectForKey:@"age"];

③.遍历字典:取得key,和value
 //字典遍历:取得的是key,然后根据key再获取对应的value
      for (NSString *temp in [dictionary1 allKeys] ) {
                 NSString *value = [dictionary1 objectForKey:temp];
                NSLog(@"%@ = %@",temp,value);
      }

④.其他一些操作
//1.判断是否和另一个字典相同
- (BOOL)isEqualToDictionary:(NSDictionary *)otherDictionary;

//2.同过字典中所有的vlaue给所有的keys排序,用到block语法.
- (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr

//3.遍历数组,通过块语法,可以对数组进行操作  
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOLBOOL *stop));  


2.可变字典(NSMutableDictionary)

可变字典继承不可变字典,继承不可变字典内的方法,同时增加了删除,添加,修改操作.

①.创建字典对象,初始化赋值操作

//笑笑语法
 NSMutaleDicrtionary *mut = [@{@"name":@"zhangdan",@"age":12} mutableCopy];
 //初始化
  NSMutableDictionary *mutable = [[NSMutableDictionary alloc] init];
 
  //便利构造器方法
  NSMutableDictionary *mutable = [NSMutableDictionary dictionaryWithCapacity:1];


  //便利构造器创建对象方法
 NSMutableDictionary *mutable1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
  @"21",@"age",@"asdf",@"name",nil]; NSLog(@"%@",mutable1);


②向可变数据字典中,添加,删除,修改元素
//往字典中添加元素.
  [mutable setObject:@"13" forKey:@"age"];
  NSLog(@"%@",mutable);
  //根据key删除对应的元素
  [mutable removeObjectForKey:@"age"];
  NSLog(@"%@",mutable);
  //修改key对应的value
  [mutable setObject:@"1sad8" forKey:@"age"];
  
  NSLog(@"%@",mutable);
  [mutable setValue:@"17" forKey:@"age"];

  //移除所有的元素
  [mutable removeAllObjects];
  
  //将字典中原来的元素替换为另一个字典中的元素
  [mutable setDictionary:otherDictionary];
  
  //快速根据key取出对应的value;
  NSString *s1 = dictionary[@"name"];//[dictionary objectForKey:@"name"]
  NSLog(@"%@",s1);
  NSString *s2 = dictionary[@"age"];
  NSLog(@"%@",s2);


3,集合(NSSet和NSMutableSet)

1).集合:无序,不能添加重复元素

2).可变集合是不可变集合的子类,包含父类的所有方法,同时可变集合增加了删除,修改,添加操作.

①不可变集合常见操作.

 //初始化方法
   NSSet *set = [[NSSet alloc] initWithObjects:@"aa",@"dd",nil];
   
   //便利构造器方法
   NSSet *set = [[NSSet alloc] initWithObjects:@"aa",@"dd",nil];

  //计算元素个数 NSUInteger num = [set count]; NSLog(@"%ld",num); NSLog(@"%@",set); 
  //获取集合中的元素 NSLog(@"%@",[set anyObject]); 
  //快速遍历 for (NSString *temp in set) { NSLog(@"%@",temp); }

  //判断集合是否包含某对象
  BOOL isContain = [set containsObject :@"dd"];

  //判断两个集合是否相同
  - (BOOL)isEqualToSet:(NSSet *)otherSet;

  //判断集合中的子串是否和传入的相同,
  - (BOOL)isSubsetOfSet:(NSSet *)otherSet;





②.可变集合操作
   //创建对象 
     NSMutableSet *set = [NSMutableSet setWithObjects:@"aa",@"bb",@"cc",@"dd",nil];
     NSMutableSet *set1 = [NSMutableSet setWithCapacity:1];
   //添加 
    [set addObject:@"rrr"]; NSLog(@"%@",set); 
    //删除
    [set removeObject:@"aa"]; NSLog(@"%@",set); 
    //删除所有 
    [set removeAllObjects]; NSLog(@"%@",set);
    //添加集合中的元素,通过数组 
    [set addObjectsFromArray:array]; 

    //将集合中的元素替换成另一个集合的元素
    [set setSet:otherSet];4.NSCountedSet

NSCountedSet的父类是NSMutableSet,所以继承了NSset和NSMutableSet里面的方法.

 

常见操作

 NSCountedSet *countSet = [NSCountedSet setWithObjects:
                                        @"aa",@"bb",@"cc",@"dd",@"ee",@"aa",nil];
  //数组中的重复个数
  NSCountedSet *count = [[NSCountedSet alloc] initWithCapacity:1];  
 NSUInteger count = [countSet countForObject:@"aa"]; NSLog(@"%ld",count);



//添加元素
- (void)addObject:(id)object;
//移出对象
- (void)removeObject:(id)object;

例题:有100个数,每个数取值范围为20 - 55 ,找出其中重复的数,重复次数.
    NSCountedSet *countSet = [NSCountedSet setWithCapacity:100];
        for (int i = 0;i < 100; i++) {
            int random = arc4random() % (55 - 22 + 1) + 20;
            printf("%d ",random);
            [countSet addObject:@(random)];
        }
        
        for (NSNumber *num in countSet) {
          NSUInteger count = [countSet countForObject:num];//记录重复的次数.
            if (count > 1) {
                NSLog(@"%d,重复次数为%ld",[num intValue],count);
            }
      }

总结:字典,集合.数组.的相同点和不同点
        /**
         *  
         *  相同点:都属于collection(集合),用来存储多个对象,并不限制对象的类型
         *  不同点:
         *   1.作用:
         *   数组管理有序的集合
         *   字典管理具有一一对应关系的数据集合
         *   集合管理无序并且互异性的元素的集合.
         *   2.特点
         *   数组:有序,并且元素可以重复.
         *   字典:无序,每一个元素都是一对键值对,一个key只能对应一个value,但是一个value可以对应多个key,key是唯一的.
         *   集合:无序,互异性(元素不能重复,但会记录重复次数.)
         *   3.取值方式:
         *   数组:通过下标获取对应元素.
         *   字典:通过key获取对用的value.
         *   集合:随机取值.anyObject,集合的效率最大化.
         *   4.快速遍历:for in遍历时不能修改遍历的集合
         *   数组:遍历出来的时数组中的元素
         *   字典:遍历出来的是字典中的key,通过key,取出对应的value值.
         *   集合:遍历出集合中的元素.
         *   5.创建对象的方法 1.初始化方法         2.便利构造器
         *    数组 :  initWithObjects:         arrayWithObjects:
         *    字典 :  initWithObjectsAndKeys:  dictionaryWithObjectsAndKeys:
         *    集合 :  initWithObjects:         setWithObjects:
         */




你可能感兴趣的:(Objective-C系列)