iOS集合之NSDictionary与NSMutableDictionary

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 
#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(@"对应的所有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 
#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 
#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 
#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];
	}
}


你可能感兴趣的:(iOS集合之NSDictionary与NSMutableDictionary)