字典NSDictionary与可变字典NSmutableDictionary的用法

1、NSDictionary不可变字典——>子类NSMutableDictionary可变字典 :都是根据一个唯一的标示键来找到的对应的值。
字典
Key————>value
索引————>文字内容
字典内部存放的是键值对
2、字典NSDictionary的创建方式:(一旦初始化就不可再修改)
(1)创建具有一个键值对的字典方法。
NSDictionary *dic=[NSDictionary dictionaryWithObject:(id) forKey:(id<NSCopying>)];
NSDictionary *dict=[NSDictionary dictionaryWithObject:@“jack”,forKey:@“name”];
(2)创建一个具有存放所有键的数组和存放对应值的数组的字典。
首先创建一个存放所有键的数组,再创建一个存放对应值的数组。然后用方法NSDictionary *dic=[NSDictionary dictionaryWithObjects:(NSArray *) forKeys:(NSArray *)];创建即可。举例如下:
NSArray *keys=@[@“name”,@“address”];
NSArray *objects=@[@“jack”,@“北京”];
NSDictionary *dict=[NSDictionary dictionaryWithObjects: objects forKeys: keys];
(3)创建直接包含所有键值的字典。
(切记顺序是<值1,键1,值 2,键2,.....nil>) 要使用如下方法:[dictionaryWithObjectsAndKeys:(id), ..., nil];举例如下:
NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys: @“jack”,@“name”,@“北京”,@“address”,nil]; 先写值,后写键。
(4)直接用 @{键1:值1,键2:值2……}; 格式创建一个NSDictionary。举例如下:
NSDictionary *dict=@{@“name”:@“Jack”,@“address”:@“北京”};
3、不可变字典NSDictionary的方法使用:
(1)通过键来返回对应的对象值。
方式一:调用objectForKey对象方法返回对应的对象元素。
例如:id obj=[dict objectForKey:@“name”];
方式二:与用数组表示的方法类似,即id=字典对象[键];例如:
id obj=dict[@“name”];
(2)返回字典中对象元素的个数用 “字典对象.count”或[字典对象 count]方法。例如dict.count
4、可变字典NSMutableDictionary对象创建常用方法
(1)创建一个空的可变字典的对象。因为它是可变的,所以在创建之后可以往里面添加键值对。具体操作如下:
NSMutableDictionary *dict=[NSMutableDictionary dictionary];
[dict setObject:@“jack” forKey: @“name”];
[dict setObject:@“北京”forKey:@“address”];
切记:当在一个可变字典对象中,如果两个对象元素的键一样的话,后面添加进去的键对应的元素会把前面相同键对应的对象元素给覆盖掉。当调用这个重复的键时,对应的是最后一个加入的对象。例如:
再加一个价值对:[dict setObject:@“rose”forKey:@“name”]的话键@“name”对应的对象是@“rose”而不是@“jack
(2)清空字典中的所有对象。使用removeAllObjects方法即可
(3)移除字典中某一个键对应的对象。调用removeObjectForKey
方法即可。[dict removeObjectForKey:(id)];
注意:字典内的键值对是没有顺序之分的。直接打印字典会出现里边的全部内容。


5、字典的遍历
注意:字典里面不允许有相同的键,但允许有相同的对象元素值。
(1)将字典对象中所有的键取到一个数组NSArray对象中再遍历数组。调用了字典对象的对象方法allkeys返回一个数组对象。例如:
NSDIctionary *dict=@{@“address”:@“北京”,@“name”:@“Jack”,@“qq”:@“2652790899”};
NSArray *keys=[dict allkeys];
for(int i=0;i<dict.count; i++)
{
NSString *key=key[i];
NSString *object=dict[key];
NSLog(@“%@=%@”,key,object);
}
(2)调用字典对象方法enumerateKeysAndsObjectsUsingBlock传入块变量进行遍历。具体操作如下:
[dict enumerateKeysAndObjectsUsingBlock:
^(id key,id obj, BOOL *stop){ //当为*stop传入YES时,跳出遍历
NSLog(@“%@-%@”,key,obj); //即 *stop=YES;
}];
(3)创建迭代器枚举字典对象。需要调用字典的对象方法objectEnumerator返回一个NSEnumerator对象,然后进行枚举。
具体操作如下:
NSEnumerator *em=[dict objectEnumerator];
id temp;
while(temp=[em nextObject]){
NSLog(@“%@”,em); //此种遍历不能获取对应的键

}

6、注意:字典对象不能被释放,如果字典对象调用releaseautorelease都会出错。

字典自带的读进文件和读出文件的方法仅仅适用于字符串,对于手动的类的对象是不适用的。

代码验证如下:

//
//  main.m
//  NSDictionary
//
//  Created by apple on 15/8/21.
//  Copyright (c) 2015年 liu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
void Test1()
{ //创建不可变字典的方式
    //方式一:调用字典的类方法dictionaryWithObjectsAndKeys
    NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:@"liuxun",@"name",@"BeiJing",@"address", nil];
    
    //方式二:用dictionaryWithObjects: ....  forKeys:...  导入一个键数组和一个对应的值数组
    NSArray *keys=[NSArray arrayWithObjects:@"name", @"address",nil];
    NSArray *objects=@[@"liuxun",@"BeiJing"];
    NSDictionary *dict1=[NSDictionary dictionaryWithObjects:objects forKeys:keys];
    
    // 方式三:用dictionaryWithObject: ....  forKey:...创建具有一个键值对的字典对象
    NSDictionary *dict2=[NSDictionary dictionaryWithObject:@"HHXY" forKey:@"xuexiao"];
    
    //方式四:用dictionaryWithDictionary将另外一个字典的键值对完全导过来
    NSDictionary *dict3=[NSDictionary dictionaryWithDictionary:dict];
    
    //方式五:用字典的对象方法writeTOFile把字典写入文件,再用字典的类方法dictionaryWIthContentsOfFile方法从这个文件读出一个字典对象。
    NSString *dicPath=[NSString stringWithFormat:@"%@/Desktop/liuxun.txt",NSHomeDirectory()];
    [dict3 writeToFile:dicPath atomically:YES];
    NSDictionary *dict4=[NSDictionary dictionaryWithContentsOfFile:dicPath];
    
    //方式六:直接利用@{键:对应值,......}创建一个字典对象
    NSDictionary *dict5=@{@"name": @"Liuxun",@"age":@"22",@"QQ":@"2652790899"};
    
    //   Person *p=[[Person alloc] initWithName:@"LiuXun" andAge:22];
    //    NSDictionary *dict6=@{@"a": p};
    //    NSURL *url=[NSURL URLWithString:@"/Users/apple/Desktop/LX.txt"];
    //  if( [dict6 writeToURL:url atomically:YES])
    //  {
    //      NSLog(@"成功"); //证明了字典对象不可以直接把对象存入文件
    //  }
    
    NSLog(@"dict=%@",dict);
    NSLog(@"dict1=%@",dict1);
    NSLog(@"dict2=%@",dict2);
    NSLog(@"dict3=%@",dict3);
    NSLog(@"dict4=%@",dict4);
    NSLog(@"dict5=%@",dict5);
}
void Test2()
{   //  创建可变字典的方式
    
    // (方式一)创建一个初始化为空的可变字典(但可以往里面添加键值对)
    NSMutableDictionary *mDic=[NSMutableDictionary  dictionary];
    [mDic setObject:@"LIUXUN" forKey:@"name"];
    [mDic  setObject:@"BEIJING" forKey:@"address"];
    [mDic   setObject:@"2652790899" forKey:@"QQ"];
    
    //(方式二)创建一个具有初始容量的可变字典
    NSMutableDictionary  *mDic1=[NSMutableDictionary  dictionaryWithCapacity:3];
    [mDic1  setValuesForKeysWithDictionary:mDic];
    
    //(方式三)从一个存放字典的本地文件中读出内容到一个新的字典
    NSMutableDictionary *mDic2=[NSMutableDictionary dictionaryWithContentsOfFile:@"/Users/apple/Desktop/liuxun.txt"];
    
    //(方式三)从一个资源路径中读取存放的字典内容到一个新的字典
    NSMutableDictionary *mDic3=[NSMutableDictionary dictionary];
    [mDic3  setObject:@"2652790899" forKey:@"QQ"];
    NSURL *url=[NSURL URLWithString:@"file:///Users/apple/Desktop/form.txt"];
    [mDic3  writeToURL:url atomically:YES];
    NSMutableDictionary *mDic4=[NSMutableDictionary  dictionaryWithContentsOfURL:url];
    
    //(方式四)把一个字典的键值对全部导入到新的可变字典
    NSMutableDictionary *mDic5=[NSMutableDictionary  dictionaryWithDictionary:mDic4];
    
    //(方式五)创建具有一个键值对的可变字典
    NSMutableDictionary *mDic6=[NSMutableDictionary dictionaryWithObject:@"BEIJING" forKey:@"shoudu"];
    
    //(方式六)将一个存放键的数组和一个存放对应值的数组导入到新的字典
    NSArray *keys2=[NSArray arrayWithObjects:@"name", @"address",nil];
    NSArray *objects2=@[@"liuxun",@"BeiJing"];
    NSMutableDictionary *mDic7=[NSMutableDictionary dictionaryWithObjects:objects2 forKeys:keys2];
    
    //(方式七)创建一个具有多个键值对的字典
    NSMutableDictionary *mDic8=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"LiuXun" ,@"name",@"BeiJing",@"address", nil];
    NSLog(@"mdic=%@",mDic);
    NSLog(@"mdic1=%@",mDic1);
    NSLog(@"mdic2=%@",mDic2);
    NSLog(@"mdic3=%@",mDic3);
    NSLog(@"mdic4=%@",mDic4);
    NSLog(@"mdic5=%@",mDic5);
    NSLog(@"mdic6=%@",mDic6);
    NSLog(@"mdic7=%@",mDic7);
    NSLog(@"mdic8=%@",mDic8);
}

void Test3()
{ //字典的遍历
    
    NSDictionary  *dic=@{@"name": @"LiuXun",@"address":@"Beijing",@"QQ":@"2652490899"};
    
    //(方式一)先获取所有的键,再进行遍历
    NSArray *allKey=[dic allKeys];
    for (int i=0; i<allKey.count; i++) {
        NSString *key=allKey[i];
        NSString *object=[dic objectForKey:key];
        NSLog(@"%@-----%@",key,object);
    }
    
    // (方式二)传入块变量
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-----%@",key,obj);
    }];
    
    //(方式三)为字典对象创建迭代器,进行枚举
    NSEnumerator *em=[dic  objectEnumerator];
    id temp;
    while (temp=[em nextObject]) { //此种方法无法获取对应的键
        NSLog(@"-----%@",temp);
    }
}

void Test4()
{  // 可变字典的一些操作
    NSArray *keys=@[@"name",@"address"];
    NSArray *objects=@[@"LiuXun",@"Beijing"];
    NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithObjects:objects forKeys:keys];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-----%@",key,obj);
    }];
    
    //添加元素的方法
    [dic setObject:@"QQ" forKey:@"2652790899"];
    [dic setObject:@"sex" forKey:@"man"];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-----%@",key,obj);
    }];
    NSLog(@"------------------------------");
    
    //清除指定键对应的元素对象
    [dic removeObjectForKey:@"sex"];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-----%@",key,obj);
    }];
    NSLog(@"------------------------------");
    
    //清除数组指定的键所对应的值
    NSArray *removeKeys=@[@"QQ",@"address"];
    [dic  removeObjectsForKeys:removeKeys];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-----%@",key,obj);
    }];
    NSLog(@"------------------------------");
    
    //清除所有的元素对象
    [dic removeAllObjects];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-----%@",key,obj);
    }];
    NSLog(@"------------------------------");
}
int main(int argc, const char * argv[])
{
    
    @autoreleasepool {
        Test1();
        //       Test2();
        //     Test3();
        //       Test4();
    }
    return 0;
}
单独运行Test1如下:


单独运行Test2如下:


单独运行Test3如下:


单独运行Test4如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值