zoukankan      html  css  js  c++  java
  • Objective-C学习篇08—NSDictionary与NSSet

    Objective-C学习篇08—NSDictionary与NSSet

     

    NSDictionary与NSMutableDictionary

    NSSet与NSMutableSte

    字典

      字典:字典分为可变字典NSDictionary和不可变字典NSMutableDictionary.字典中的数据都是以键值对的形式保存的,键和值可以是任何对象,一般使用字符串作为键.

      使用字典可以大大提高我们编程的效率,下面让我们看一个用字典表示乐曲信息的例子.表示乐曲信息的结构基本都是一样的,但也有个别乐曲有所不同,例如有的乐曲的作者是多个人,有的乐曲有参考信息等.

      图(a)中,每个框包围的部分就是一个字典对象。一个乐曲的完整信息由多个字典对象构成,例如,可以通过name得到曲名,通过lyrics得到作词者,通过music得到作曲者.通过note得到备注.当然也有可能其中某一项是空的.

     

      在这个例子中,key和value都是字在串类型的对象,value由多个字符串构成的时候可以用()把它们括起来,这种情况下字典对象的值相当―个数组对象.另外,除了字符串之外,字典对象的值还支持任意对象.例如,也可以把歌曲的声音或视频定义为―个对象放人字典对象中.

      让我们再来看―个用字典对象表示大学教室的例子,如图(b)所示,和乐曲的例子一样,每个框包围的部分就是一个字典对象.关键字capacity用来表明教室可以装多少个人mic和screen用来表明教室是否配备了麦克和投影屏幕.数值类型的value既可以使用字符串也可以使用NSNumber来描述.

      在面向过程的语言中,一般使用下标或成员名来获取数组或结构体的值。字典对象的key和value都可以是对象类型.所以可扩展性非常高,可以用在各种环境下.

      字典的键必须是唯一的.另外,nil不能作为字典的键.

      字典对象的值可以是除了nil外的任意对象,也可以是数组对象或字典对象。

       

     NSDictionary

      NSDictionary 字典继承自NSObject 是一个不可变的字典,字典中存储的元素都是以键值对的形式存在(key-value),数据存储是按照key1:value1 key2:value2 ...的形式进行存储.key值必须是唯一的,value值可以重复.字典中只能存放对象类型的数据,key值和value值必须是对象,且字典中存放的键值对是无序的.

     

      创建

      1. 创建一个空字典 init   便利构造器  dictionary

    NSDictionary *dic = [[NSDictionary alloc] init];
    
    NSDictionary *dic1 = [NSDictionary dictionary];

      2. 创建拥有键值对的字典   initWithObjectsAndKeys:

          便利构造器方法  dictionaryWithObjectsAndKeys:

    NSDictionary *dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"18", @"age", @"zhangSan", @"name", @"yao", @"gender", nil];
    NSLog(@"%@", dic2);

      打印:

         2015-11-30 13:01:40.306 Myself[1711:145326] {

         age = 18;

         gender = yao;

         name = zhangSan;

         }

     

      注意事项:

       1.的时候value值在前,key值在后

         2. 字典是无序的

         3. 字典在创建时以nil结尾

         4. key值一般都是字符串对象,value值可以是任意的,但必须也是对象类型的

     

      3. 用一个已有的字典对象初始化另一个字典  initWithDictionary:

       便利构造器方法  dictionaryWithDictionary:

    NSDictionary *dic3 = [[NSDictionary alloc] initWithDictionary:dic2];

      4.访问

    复制代码

    1. 获取字典中键值对的数量 count NSInteger dCount = dic3.count;

    2. 获取字典中所有的key值 .allKeys NSArray *keyArray = dic3.allKeys; 3. 获取字典中所有的value值 .allValues NSArray *valueArray = dic3.allValues; 4. 根据给定的key值返回对应的value值 objectForKey: NSString *value = [dic3 objectForKey:@"age"]; NSLog(@"%@", value); // 打印 18

    复制代码

      5. 遍历字典

      forin 遍历字典的时候,默认遍历的就是字典的key值

    for (NSString *key in dic3) {
    
        NSString *value = [dic3 objectForKey:key];
        NSLog(@"%@ = %@", key, value);
    }

      打印:

         2015-11-30 13:13:57.952 Myself[1737:151680] age = 18

         2015-11-30 13:13:57.952 Myself[1737:151680] name = zhangSan

         2015-11-30 13:13:57.952 Myself[1737:151680] gender = yao

     

     

    NSMutableDictionary

      NSMutableDictionary 可变字典,继承自 NSDictionary,管理的是可变键值对,相对于NSDictionary增加了删除,添加,修改的方法,随着字典中元素的变更,NSMutableDictionary会自动管理内存.

      创建

      创建并初始化一个长度为capacity的可变字典  initWithCapacity

      便利构造器方法 dictionaryWithCapacity

    NSMutableDictionary *mDic = [[NSMutableDictionary alloc] initWithCapacity:0];
    
    NSMutableDictionary *mDic1 = [NSMutableDictionary dictionaryWithCapacity:0];   

      增加和删除

      1. 添加键值对  setObject:<#(id)#> forKey:<#(id<NSCopying>)#>

    [mDic setObject:@"wangMaZi" forKey:@"L"];
    
    [mDic setObject:@"zhangSan" forKey:@"B"];

      2. 修改键值对  setObject:<#(id)#> forKey:<#(id<NSCopying>)#>

    [mDic setObject:@"xiaoPing" forKey:@"B"];
    
    NSLog(@"%@", mDic);

      注意:添加和修改键值对的方法是一样的,如果发现字典中没有对应的key值,此时就添加,如果发现字典中有相同key值存在,此时就覆盖,原因就是字典中key值是唯一的

     

      3. 根据key值删除键值对 removeObjectForKey:

    [mDic removeObjectForKey:@"L"];

      4. 删除字典中所有的键值对   removeAllObjects

     

    [mDic removeAllObjects];

     

     

       

    NSSet

      Foundation框架中提供了NSSet,它是一组单值对象的集合.同NSArray不同,NSSet存储的是无序的对象,同一个对象也只能保存一个.

      集合的特点:

        1. 集合中的元素都是唯一的

        2. 集合中的元素都是无序的

        3. 集合中只能方对象类型的元素

      

      1. 创建一个空集 init  便利构造器方法 set

    NSSet *set = [[NSSet alloc] init];
    
    NSSet *set1 = [NSSet set];

       

      2. 创建一个拥有元素的集合  initWithObjects:

        便利构造器方法  setWithObjects:

     NSSet *set2 = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", nil];

      3. 用一个数组初始化集合对象  arrayWithObjects:

      若array中存在重复元素时,可以把数组中重复的元素剔除掉,在集合中只会保存一个.

    NSArray *sArr = [NSArray arrayWithObjects:@"1", @"2", @"2", @"4", @"5", nil];
    
    NSSet *set3 = [NSSet setWithArray:sArr];
    
    NSLog(@"%@", set3);

         2015-11-30 14:37:46.206 Myself[1784:178830] {(

         1,

         4,

         2,

         5

         )}

      访问

    复制代码
    4. 获取集合中元素的个数 count
    NSInteger *sCount = set2.count;
    
    5. 获取集合中随机元素  anyObject
    NSString *sValue = set2.anyObject;
    
    6. 获取集合中所有的元素 allObjects
    NSArray *sArray = set2.allObjects;
    复制代码

     判断

     7. 判断集合中是否包含某个对象 containsObject:

    BOOL isCountain = [set2 containsObject:@"1"];
    
    NSLog(@"%@", isCountain ? @"包含" : @"不包含");//包含

     8. 判断是不是子集 isSubsetOfSet:

    复制代码
    NSSet *set4 = [NSSet setWithObjects:@"1", @"2", @"3", nil];
    
    NSSet *set5 = [NSSet setWithObjects:@"1", @"2", nil];
    
    BOOL isSub = [set5 isSubsetOfSet:set4];
    
    NSLog(@"%@", isSub ? @"是子集" : @"不是子集");// 是子集
    复制代码

      9. 判断两个集合是否有交集 intersectsSet:

    BOOL isInter = [set4 intersectsSet: set5];
    
    NSLog(@"%@", isInter ? @"有交集" : @"没有交集");//有交集

       10. 判断两个集合是否相同 isEqualToSet:

    BOOL isSame = [set4 isEqualToSet:set5];
    
    NSLog(@"%@", isSame ? @"相同" : @"不相同");

       

       

      NSMutableSet

       NSMutableSet 可变的集合,继承自 NSSet

      1. 创建  setWithCapacity:

    复制代码
    NSMutableSet *mSet = [NSMutableSet setWithCapacity:0];
    
    [mSet addObject:@"1"];
    
    [mSet addObject:@"123"];
    
    [mSet addObject:@"456"];
    
    NSLog(@"%@", mSet);
    复制代码

      2. 删除可变集合中的元素  removeObject:

    [mSet removeObject:@"1"];
    
    NSLog(@"%@", mSet);

      3. 删除可变集合中所有的元素  removeAllObjects

    [mSet removeAllObjects];
    
    NSLog(@"%@", mSet);

         总结:

         1.有序的角度: 数组有序, 字典和集合都是无序的

         2.能否通过下标来访问: 数组可以, 字典和集合都不可以

         3.元素是否可以重复: 数组可以重复, 字典中key值不可以重复,value值可以重复, 集合中元素不可以重复

         4.打印的样式: 数组: () 字典: {} 集合:  {()}

     

         注意:数组和字典经常结合起来使用;

     
  • 相关阅读:
    【Java Web】使用URLRewrite实现网站伪静态
    Jsp的include指令静态导入和动态导入的区别
    JSP中使用cookie存储中文
    【转】android加载大量图片内存溢出的三种解决办法
    Android调整TimePicker和DatePicker大小
    使用WebClient实现通讯(Silverlight学习笔记)
    Silverlight 用户控件与自定义控件详解
    利用WebClient和WebRequest类获得网页源代码
    Silverlight中的对象序列化/反序列化
    Flex与FLASH区别及Flex动画效果学习
  • 原文地址:https://www.cnblogs.com/zmc815/p/5325838.html
Copyright © 2011-2022 走看看