• OC第四节——NSDictionary和NSMutableDictionary


    NSDictionary
        1、什么是字典
            字典是也是一种集合结构,功能与我们现实中的字典工具一样
        2、字典的元素是什么
            任意类型的对象地址构成键值对
        3、什么是键值对
            键值对是由key和value构成必须一一对应
            键值对中的key必须保证是唯一的    
        4、字典的存储方式
           字典是一种无序保存的集合
        5、如何查找值
            根据键值对中的key找到相应的值


    ================================================
    NSDictionary的创建

          1)如何创建一个字典对象
            //实例化方法
            -(id)initWithObjectsAndKeys: (id)object,…;
            -(id)initWithDIctionary:(NSDictionary*)otherDictionary;
            -(id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;

            //类方法创建
            +(id)dictionaryWithObjectsAndKeys:(id)object,….;
            +(id)dictionaryqWithDictionary:(NSDictionary *)dict;
            +(id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;


            //创建2
            NSDictionary *dic = @{@“1”: @“one”, @“2”:@“two”};

     
            //字典中的元素是以键值对的形式存储
            //@"One" 和 @"1" 组成了一个键值对
            //@"One"称为值(value)@"1" 称为键
            //键值对的键和值,都是任意的对象,但是键往往使用字符串
            //字典和数组都是存贮对象地址,
            //字典存储对象的地址没有顺序
            //key不能重复

        2、获取键值对个数
            - (NSUInteger)count;

        3、如何通过key获取对应的value(值是目的, 键是手段)
          - (id)objectForKey:(id)aKey;
            或者是:  dic[@“1”];    

        4、获取字典中所有的key
            -(NSArray *)allKeys;

         5、获取字典中所有的值
            -(NSArray *)allValues;

        6、获取值是anObject的所有的key
            -(NSArray *)allKeyForObject:(id)anObject;


        7、如何遍历字典内容
            
        
        枚举器法:
        键的遍历:
          1)keyEnumerator消息
            作用:获取所有的key值
            NSEnumerator *emunerator = [dict keyEnumerator];
            id obj;
            while (obj = [emunerator nextObject]) {
                NSLog(@“%@“, obj);
            }

        值得遍历
             objectEnumerator 消息
        
        快速枚举法:
        快速枚举法:得到的是键
            for (id key in dict)
            {
                NSLog(@“key — %@, value = %@, key, [dict                     objectForKey:obj]); // 得到了键就得到了值
            }



        5.NSDictionary和NSArray的对比
           1)字典相对与数组的优点
             字典获取元素速度比数组快,原因是字典通过哈希算法得到每个元素具体的位置
           2)获取元素的方式
             数组通过下标获取指定元素的内容     objectAtIndex
             字典通过key来获取指定元素的内容    objectForKey  不能通过下标
                dict[@“1”]

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            /*
             NSDictionary: 字典,用来存储数据
             数据  是以键值对的方式存在
             
             键(索引)  ---------  值
             
             1          =       one;
             2          =       two;
             3          =       three;
             
             键和值可以是任意的对象, 一般【键】都是以【字符串】的形式表示
             字典的存储顺序,不是按照初始化的方法来存储,按照存储速度最快的方式
             的方式来存储-----------哈希算法(散列的算法)
             
             
             【注】键唯一,值可以不唯一
             
             */
            
            NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"two",@"2",@"three",@"3", @"one",@"1", nil];
            NSLog(@"dict = %@", dict);
            
            
            NSDictionary *dict1 = [[NSDictionary alloc] initWithDictionary:dict];
            
            NSString *objArr[] = {@"zhangfei",@"liubei",@"guanyu"};
            NSString *keyArr[] = {@"xiaohei",@"xiaobai",@"xiaohong"};
            NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objArr forKeys:keyArr count:3];
            NSLog(@"dict2 = %@", dict2);
            
            
            //键不能相同,值可以相同
            NSDictionary *dict3 = [NSDictionary dictionaryWithObjects:@[@"zhangfei",@"liubei",@"guanyu",@"zhangfei"] forKeys:@[@"xiaohei",@"xiaobai",@"xiaohong",@"laosan"]];
            NSLog(@"dict3 = %@", dict3);
            
            
            
            //____________常用的方法_____________________
            
            
            //_______获取键值对的个数________
            NSUInteger len = [dict3 count];
            NSLog(@"len = %lu", len);
            
            //_______根据键获取值_键是手段,值才是目的____
            //objectForKey:(id)key
            id obj = [dict3 objectForKey:@"xiaohei"];
            NSLog(@"obj = %@", obj);
            
            
            //可以使用 []
            id obj2 = dict3[@"xiaohong"];
            NSLog(@"obj2 = %@", obj2);
            
            
            
            //_______获取所有的key____________
            NSArray *allKeys = [dict3 allKeys];
            NSLog(@"allKeys = %@", allKeys);
            
            
            //_______获取所有的值_____________
            NSArray *allObjects = [dict3 allValues];
            NSLog(@"allObjects = %@", allObjects);
            
            
            //_______根据值获取所有的键_________
            NSArray *allKeyForObj = [dict3 allKeysForObject:@"zhangfei"];
            NSLog(@"allKeyForObj = %@", allKeyForObj);
            
            
            
            //_______遍历字典__________________
            //___枚举器____既可以遍历key,也可以遍历value
            NSEnumerator *keys = [dict3 keyEnumerator];
            NSString *key = nil;
            while (key = [keys nextObject]) {
                NSLog(@"key-----%@, value------%@", key, dict3[key]);
            }
            
            //枚举所有的值
            NSEnumerator *values = [dict3 objectEnumerator];
            id obj3 = nil;
            while (obj3 = [values nextObject]) {
                NSLog(@"value = %@", obj3);
            }
            
            
            //_____快速枚举法______得到的是key____
            for (id obj in dict3) {
                NSLog(@"key---%@, value----%@", obj,dict3[obj]);
                
            }
            
        }
        return 0;
    }
    


    ============================
    NSMutableDictionary
        1、NSMutableDictionary和NSDictionary的区别    
        2、如何创建
          1)dictionary消息
            作用:创建一个空的字典
          2)dictionaryWithObjects:forKeys: 消息
            作用:通过指定数组来创建一个字典对象
     
        3、增加键值对
          -(void)setObject:(id)anObject forKey:(id)akey;

                备注:如果不存在键——添加
                            如果键已存在—--修改


        4.可变字典的删除
          1)通过指定key删除一组键值对
            -(void)removeObjectForKey:(id)aKey;

          2)通过指定的一个数组内容来删除相关的键值对
            -(void)removeObjectsForKeys:(NSArray *)keyArray;

          3)删除字典中所有的键值对
            -(void)removeAllObjects;
        
        5、修改
            修改整个字典
            - (void)setDictionary;(NSDictionary *)otherDictionary;
            修改键值对
            - (void)setObject:(id)anObject forKey:(id)

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
    //        NSMutableDictionary 是  NSDictionary 的子类
            //@[]
            NSDictionary *dict = @{@"1": @"one", @"2":@"two",@"3":@"three"};
    
            
            NSMutableDictionary *dict1 = [[NSMutableDictionary alloc] initWithObjects:@[@"one",@"two"] forKeys:@[@"1",@"2"]];
            
            //创建空字典
            NSMutableDictionary *dict2 = [NSMutableDictionary dictionary];
            
            NSLog(@"dict2 = %@", dict2);
            
            //_______添加键值对___________
            [dict2 setObject:@"zhangsan" forKey:@"1"];
            [dict2 setObject:@"lisi" forKey:@"2"];
            [dict2 setObject:@"wangwu" forKey:@"3"];
            NSLog(@"dict2 = %@", dict2);
            
            [dict2 setObject:@"zhaoping" forKey:@"6"];
            
            [dict2 removeObjectForKey:@"1"];
            
            //_______删除键值对_______________
            [dict2 removeObjectForKey:@"1"];
            NSLog(@"dict2 = %@", dict2);
            
            //将字典的key和数组相同的元素的键值对删除
            [dict2 removeObjectsForKeys:@[@"2",@"5"]];
            NSLog(@"dict2 = %@", dict2);
            
            
            [dict2 setObject:@"nimei" forKey:@"4"];
            
            //_______改______set的键和已有的键相同_____
            [dict2 setObject:@"laowu" forKey:@"3"];
            NSLog(@"dict2 = %@", dict2);
            
            
            //__重置____
            [dict2 setDictionary:dict];
            NSLog(@"dict2 = %@", dict2);
            
            
        }
        return 0;
    }
    

    /*************************************************************************

    NSDictionary

    ****************************************************************************/

    //内容可以是任意的对象指针 //内容是一些键值对 key value //必须成对出现 一个 key 对应一个 value //key 是唯一的 不能出现多个相同的 key

    1.创建一个不可变字典(1)
    NSDictionary*dict=[[NSDictionary alloc]initWithObjectsAndKeys:@"1",@"one",@"2",@"two",@"3",@"three",@"4", @"four",@"5",@"five", nil];//
    创建一个不可变字典(2)
    NSDictionary * dict1 = [NSDictionary dictionaryWithDictionary:dict]; 创建一个不可变字典(3)
    NSArray * values =[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"4", nil]; NSArray*keys=[[NSArray alloc]initWithObjects:@"one",@"two",@"three",@"four", nil];
    NSDictionary* dict2 = [[NSDictionary alloc]initWithObjects:values forKeys:keys];

    //键值对的个数
    NSLog(@"count = %ld",[dict2 count]);

    //查找 通过 key 找到对应值
    NSLog(@"%@",[dict objectForKey:@"four"]); 词典类的存在就是为了解决在大量数据中查找方便,因为它是通过 key 直接找到 value 所以速度很快,避免一个个的遍历寻找造成的效率低下,善用字典类会帮 你的程序提速。

    //创建 key 的枚举器
    NSEnumerator * keyenumer = [dict keyEnumerator]; while (obj = [keyenumer nextObject]) {

    NSLog(@"obj = %@",obj); }

    //快速枚举枚举的是 key for (id od in dict) {

    NSLog(@"od = %@",od); }

    /*******************************************************************************

    NSMutableDictionary

    *******************************************************************************

    / NSMutableDictionary NSDictionary的子类,所以继承了NSDictionary的方法。

    //创建可变字典

    NSMutableDictionary*dict=[[NSMutableDictionary alloc]initWithObjectsAndKeys:@"1",@"one",@"2",@"two",@"3",@"three",@"4", @"four", nil];
    NSMutableDictionary*dict1 =[NSMutableDictionary dictionaryWithCapacity:10] : 创建一个可变词典初始指定它的长度为 10.,动态的添加数据如果超过 10 这个 词典长度会自动增加,所以不用担心数组越界。

    //增加 删除 修改
    [dict setObject:@"5" forKey:@"five"];//字典中不存在@fivekey 那么就是增 加键值对
    [dict setObject:@"7" forKey:@"one"];//字典中存在@onekey 那么就是修改@ one”对应的值
    [dict removeObjectForKey:@"one"];//删除键值对
    - (void)removeAllObjects;//删除所有键值对
    - (void)removeObjectsForKeys:(NSArray *)keyArray;//删除keys 数组对应的键值对
    - (void)setDictionary:(NSDictionary *)otherDictionary;//修 改字典

  • 相关阅读:
    操作系统_3:linux教程列表
    MongoEngine 查询语法
    Spark_1:教程索引
    软件需求十步走之阅读笔记03
    软件需求十步走之阅读笔记02
    软件需求十步走之阅读笔记01
    暑期学习四
    暑期学习三
    暑期学习二
    暑期学习一
  • 原文地址:https://www.cnblogs.com/laolitou-ping/p/6181542.html
Copyright © 2020-2023  润新知