1、NSDictionary功能与用法
类方法与实例方法创建NSDictionary对象,类方法以dictionary开始,而实例方法则以init开头,下面是常见的方法:
- dictionary:创建一个不包含任何key-value对的NSDictionary
- dictionaryWithContentsOfFile:/initWithContentsOfFile:读取指定文件的内容,使用指定的文件内容来初始化NSDictionary,该文件由NSDictionary自己输出生成的。
- dictionaryWithDictionary:/initWithDictionary::使用已有的NSDictionary包含的key-value对来初始化NSDictionary对象
- dictionaryWithObject:forKey::使用单个key-value来创建NSDictionary对象
- dictionaryWithObjects:forKeys:/initWithObjects:forKeys::使用两个NSArray分别指定key、value集合,可以创建包含多组key-value对的NSDictionary
- dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys::调用该方法时,需要按value1、key1、value2、key2……nil的格式传入多组key-value对的NSDictionary
2、访问集合包含的key或value
- count:该方法返回NSDictionary包含的key-value对的数量
- allKeys:返回NSDictionary所包含的全部key
- allKeysForObject::返回指定value对应的全部key
- allValues:该方法返回NSDictionary所包含的全部value
- objectForKey:获取NSDictionary中指定key对应的value
- objectForKeyedSubscript:允许NSDictionary通过下标法来获取指定的key对应的value
- valueForKey:该方法获取该NSDictionary中指定key对应的value
- keyEnumerator:返回用于遍历该NSDictionary所有key的NSEnumerator对象
- objectEnumerator:该方法返回用于遍历该NSDictionary所有value的NSEnumerator对象
- enumerateKeysAndObjectsUsingBlock::使用指定的代码块来迭代执行该集合中所有的key-value对
- 恶奴么rateKeysAndObjectsWithOptions:usingBlock:使用指定的代码块来迭代执行该集合中所有的key-value对,该方法可以传入一个额外的NSEnumerationOptions参数
- writeToFile:atomically::将该NSDictionary对象的数据写入文件。
3、遍历NSDictionary实例
#import <Foundation/Foundation.h>
#import "NSDictionary+print.h"
#import "FKUser.h"
int main(int argc , char * argv[])
{
@autoreleasepool{
// 直接使用多个value,key的形式创建NSDictionary对象
NSDictionary* dict = [NSDictionary
dictionaryWithObjectsAndKeys:
[[FKUser alloc] initWithName:@"sun"
pass:@"123"], @"one",
[[FKUser alloc] initWithName:@"bai"
pass:@"345"], @"two",
[[FKUser alloc] initWithName:@"sun"
pass:@"123"], @"three",
[[FKUser alloc] initWithName:@"tang"
pass:@"178"], @"four",
[[FKUser alloc] initWithName:@"niu"
pass:@"155"], @"five" , nil];
[dict print];
NSLog(@"dict包含%ld个key-value对", [dict count]);
NSLog(@"dict的所有key为:%@" , [dict allKeys]);
NSLog(@"<FKUser[name=sun,pass=123]>对应的所有key为:%@"
, [dict allKeysForObject:
[[FKUser alloc] initWithName:@"sun"
pass:@"123"]]);
//①:获取遍历dict所有value的枚举器
NSEnumerator* en = [dict objectEnumerator];
NSObject* value;
//②:使用枚举器来遍历dict中所有value。
while(value = [en nextObject])
{
NSLog(@"%@" , value);
}
// 使用指定代码块来迭代执行该集合中所有key-value对。
[dict enumerateKeysAndObjectsUsingBlock:
// 该集合包含多个key-value对,下面代码块就执行多少次
^(id key, id value, BOOL *stop)
{
NSLog(@"key的值为:%@" , key);
[value say:@"疯狂iOS讲义"];
}];
}
}
4、对key进行排序#import <Foundation/Foundation.h>
#import "NSDictionary+print.h"
int main(int argc , char * argv[])
{
@autoreleasepool{
// 直接使用多个value,key的形式创建NSDictionary对象
NSDictionary* dict = [NSDictionary
dictionaryWithObjectsAndKeys:
@"Objective-C" , @"one",
@"Ruby" , @"two",
@"Python" , @"three",
@"Perl" , @"four", nil];
// 打印dict集合的所有元素
[dict print];
// 获取所有直接调用value的compare:方法对所有key进行排序。
//①:返回排好序的所有key组成的NSArray。
NSArray* keyArr1 = [dict keysSortedByValueUsingSelector:
@selector(compare:)];
NSLog(@"%@" , keyArr1);
//②:keysSortedByValueUsingComparator排序
NSArray* keyArr2 = [dict keysSortedByValueUsingComparator:
// 对NSDictionary的value进行比较,字符串越长,即可认为该value越大
^(id value1, id value2)
{
// 下面定义比较大小的标准:字符串越长,即可认为value越大
if([value1 length] > [value2 length])
{
return NSOrderedDescending;
}
if([value1 length] < [value2 length])
{
return NSOrderedAscending;
}
return NSOrderedSame;
}];
NSLog(@"%@" , keyArr2);
// 将NSDictionary的内容输出到指定文件中
[dict writeToFile:@"mydict.txt" atomically:YES];
}
}
5、对key进行过滤- keysOfEntriesPassingTest:使用代码块迭代处理NSDictionary的每一个key-value对,对NSDictionary的key-value进行过滤,该代码块必须返回BOOL类型的值,只用当该代码块返回YES时,该key才会被保留下来,该代码块可以接受3个参数,第一个参数代码正在迭代处理的key,第二个参数代表正在迭代处理的value,第三个参数代表是否还需要继续迭代,如果第三个参数设为NO,该方法就会立即停止迭代
- keysOfEntriesWithOptions:passingTest::该方法的功能与前一个方法的功能基本相同,只是该方法可以额外传入一个附加的NSEnumerationOptions选项。
#import <Foundation/Foundation.h>
#import "NSDictionary+print.h"
int main(int argc , char * argv[])
{
@autoreleasepool{
// 直接使用多个value,key的形式创建NSDictionary对象
NSDictionary* dict = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:89] , @"Objective-C",
[NSNumber numberWithInt:69] , @"Ruby",
[NSNumber numberWithInt:75] , @"Python",
[NSNumber numberWithInt:109] , @"Perl", nil];
// 打印dict集合的所有元素
[dict print];
//①:对NSDictionary的所有key进行过滤
NSSet* keySet = [dict keysOfEntriesPassingTest:
// 对NSDictionary的value进行比较,字符串越长,即可认为该value越大
^(id key, id value, BOOL* stop)
{
// 当value的值大于80时返回YES
// 这意味着只有value的值大于80的key才会被保存下来
return (BOOL)([value intValue] > 80);
}];
NSLog(@"%@" , keySet);
}
}
5、NSMutableDictionary较NSDictionary增加了如下方法:
- setObject:forKey:设置一个key-value对,如果NSDictionary中没有包含与该key相同的key-value,NSDictionary将会新增一个key-value对,否则key-value将会覆盖已有的key-value对
- setObject:forKeyedSubscript:通过该方法的支持,允许程序通过下标法来设置key-value对
- addEntriesFromDictionary::将另一个NSDictionary中所有的key-value对复制到当前NSDictionary中
- setDictionary::用另一个NSDictionary中所有的key-value对替换当前NSDictionary中得key-value对
- removeObjectForKey::根据key来删除key-value对
- removeAllObjects:清空该NSDictionary
- removeObjectsForKeys:使用多个key组成的NSArray作为参数,同时删除多个key对应的key-value对
#import <Foundation/Foundation.h>
#import "NSDictionary+print.h"
int main(int argc , char * argv[])
{
@autoreleasepool{
//①:直接使用多个value,key的形式创建NSDictionary对象
NSMutableDictionary* dict = [NSMutableDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:89] , @"疯狂Android讲义", nil];
// 使用下标法设置key-value对。
// 由于NSDictionary中已存在该key,
//②:因此此处设置的value会覆盖前面的value。
dict[@"疯狂Android讲义"] = [NSNumber numberWithInt:99];
[dict print];
NSLog(@"--再次添加key-value对--");
dict[@"疯狂XML讲义"] = [NSNumber numberWithInt:69];
[dict print];
NSDictionary* dict2 = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:79] , @"疯狂Ajax讲义",
[NSNumber numberWithInt:89] , @"Struts 2.x权威指南"
, nil];
//③:将另外一个NSDictionary中的key-value对添加到当前NSDictionary中
[dict addEntriesFromDictionary:dict2];
[dict print];
//④:根据key来删除key-value对
[dict removeObjectForKey:@"Struts 2.x权威指南"];
[dict print];
}
}