本文主要是介绍Objective-c 语法之集合NSDictionary NSSet NSArray,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、不可变词典 NSDictionary 的主要用法
[ NSDictionary dictionaryWithobjectsAndKeys:....]: 使用键值对直接创建词典对象,结尾必须使用nil 标志结束。
[ dictionary count]: 得到词典的键值对数量.
[ dictionary keyEnumerator] :将词典的所有key储存在NSEnumerator 中, 类似于java中的迭代器
[ dictionary objectEnumeration ]:将词典的所有value 储存在NSEnumerator 中
[ dictionary objectForKey ]: 通过传入key对象可以拿到当前key对应储存的值
int main(int argc, const char * argv[])
{@autoreleasepool {NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"25",@"age",@"张三",@"name",@"男",@"性别",nil];NSLog(@"%lu", [dictionary count]);NSEnumerator *enumeratorKey = [dictionary keyEnumerator];for (NSObject *object in enumeratorKey) {NSLog(@"key:%@", object);}NSEnumerator *enumeratorObject = [dictionary objectEnumerator];for (NSObject *object in enumeratorObject) {NSLog(@"value:%@", object);}NSLog(@"key name的值是:%@", [dictionary objectForKey:@"name"]);}return 0;
}
打印结果
2012-07-09 16:31:18.276 objectiveC[2965:403] 3
2012-07-09 16:31:18.282 objectiveC[2965:403] key:age
2012-07-09 16:31:18.282 objectiveC[2965:403] key:name
2012-07-09 16:31:18.283 objectiveC[2965:403] key:性别
2012-07-09 16:31:18.283 objectiveC[2965:403] value:25
2012-07-09 16:31:18.284 objectiveC[2965:403] value:张三
2012-07-09 16:31:18.284 objectiveC[2965:403] value:男
2012-07-09 16:31:18.285 objectiveC[2965:403] key name的值是:张三
2、可变的词典NSMutableDictionary
NSMutableDictionary是NSDictionary的子类。所以继承了NSDictionary 的方法,以上的代码对NSMutableDictionary来说完全可用,我们可以试试不一样的地方增删键值数据
[ dictionary setObject:forkey: ] :向可变的词典动态的添加数据
[ dictionary removeAllObjects..]: 删除掉词典中的所有数据
[ dictionary removeObjectForkey ...] : 删除掉词典中指定key的数据
int main(int argc, const char * argv[])
{@autoreleasepool {NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"25",@"age",@"张三",@"name",@"男",@"性别",nil];[dictionary setObject:@"30名" forKey:@"名次"];NSLog(@"%lu", [dictionary count]);NSEnumerator *enumeratorKey = [dictionary keyEnumerator];for (NSObject *object in enumeratorKey) {NSLog(@"key:%@", object);}NSEnumerator *enumeratorObject = [dictionary objectEnumerator];for (NSObject *object in enumeratorObject) {NSLog(@"value:%@", object);}NSLog(@"key 名次的值是:%@", [dictionary objectForKey:@"名次"]);[dictionary removeObjectForKey:@"名词"];NSLog(@"%lu", [dictionary count]);}return 0;
}
打印结果
2012-07-09 16:37:07.037 objectiveC[3053:403] 4
2012-07-09 16:37:07.042 objectiveC[3053:403] key:age
2012-07-09 16:37:07.043 objectiveC[3053:403] key:性别
2012-07-09 16:37:07.043 objectiveC[3053:403] key:name
2012-07-09 16:37:07.044 objectiveC[3053:403] key:名次
2012-07-09 16:37:07.044 objectiveC[3053:403] value:25
2012-07-09 16:37:07.045 objectiveC[3053:403] value:男
2012-07-09 16:37:07.045 objectiveC[3053:403] value:张三
2012-07-09 16:37:07.046 objectiveC[3053:403] value:30名
2012-07-09 16:37:07.046 objectiveC[3053:403] key 名次的值是:30名
3、NSArray 不可变的数组
Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
[ array count]: 数组的长度
[ array objectAtIndex 0] : 传入数组角标的id 得到数据对象
[ array WithObjects;...] : 向数组对象初始化赋值,这里可以写任意的指针,结尾必须使用nil.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{@autoreleasepool {NSObject *obj = [[NSObject alloc]init]; NSArray *array = [NSArray arrayWithObjects:@"a",obj,@"c",nil];NSLog(@"array Count:%lu",[array count]);//遍历数组for (NSObject *object in array) {NSLog(@"数组对象:%@", object);}[obj release];}return 0;
}
打印结果
2012-07-09 10:52:17.050 objectiveC[944:403] array Count:3
2012-07-09 10:52:17.052 objectiveC[944:403] 数组对象:a
2012-07-09 10:52:17.052 objectiveC[944:403] 数组对象:<NSObject: 0x7fe479c14110>
2012-07-09 10:52:17.053 objectiveC[944:403] 数组对象:c
查找数组索引对应的对象
NSLog(@"Index 2:%@", [array objectAtIndex:2]);
打印结果:2012-07-09 10:55:16.382 objectiveC[993:403] Index 2:c
[NSMutableArray arrayWithCapacity:6] :初始化可变数组对象的长度,如果后面代码继续添加数组超过长度6以后NSMutableArray的长度会自动扩充,6是自己可以设置的颗粒度。
[array addObject:...] : 向可变数组尾部添加数据对象。
[array addObjectsFromArray:..] :向可变数组尾部添加一个数组对象。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{@autoreleasepool {NSObject *obj = [[NSObject alloc]init]; NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];[muArray addObject:@"对象1"];[muArray addObject:@"对象2"];[muArray addObject:@"对象3"];[muArray addObject:@"对象4"];[muArray insertObject:@"搅局的" atIndex:2];[muArray addObject:obj];for (NSObject * object in muArray) {NSLog(@"数组对象:%@", object);} [obj release];}return 0;
}
打印
2012-07-09 14:01:08.994 objectiveC[2090:403] 数组对象:对象1
2012-07-09 14:01:08.996 objectiveC[2090:403] 数组对象:对象2
2012-07-09 14:01:08.997 objectiveC[2090:403] 数组对象:搅局的
2012-07-09 14:01:08.997 objectiveC[2090:403] 数组对象:对象3
2012-07-09 14:01:08.998 objectiveC[2090:403] 数组对象:对象4
2012-07-09 14:01:08.998 objectiveC[2090:403] 数组对象:<NSObject: 0x109714110>
NSRange range = NSMakeRange(0,3); 设置一个范围为 0 到 3 之间。
[array removeObject:obj inRange:range] : 设置在一个范围内删除数据,如果这个范围内没有删除的这个对象则不会删除任何东西。例子中因为obj对象在 数组 0 到 3的范围内,所以obj就被删除掉了。
4.2、removeObject和removeObjectIdenticalTo
[array removeObject:(id)] :删除数组中指定元素,根据对象isEqual消息判断。
[array removeObjectIdenticalTo:(id)] : 删除数组中指定元素,根据对象的地址判断
[array removeObjectIdenticalTo:(id) inRange:(NSRange)] : 在指定范围内删除指定的元素。
[array removeObjectAtIndex:(NSUInteger)]:删除数组中指定脚标索引的数据。
[array removeObjectsInArray:(NSArray *)] :删除一个数组的元素。
下面我们主要验证下removeObject removeObjectIdenticalTo这两个方法的区别,
先实验removeObject的使用int main(int argc, const char * argv[])
{@autoreleasepool {NSString *str1 = [[NSString alloc] init];NSString *str2 = [[NSString alloc] init];NSString *str3 = [str1 stringByAppendingFormat:@"字符串"];NSString *str4 = [str2 stringByAppendingFormat:@"字符串"];NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];[muArray addObject:@"对象"];[muArray addObject:str3];[muArray addObject:str4];for (NSObject * object in muArray) {NSLog(@"数组对象:%@", object);}if ([str3 isEqual:str4]) {NSLog(@"str1 isEqual str2");}if (str3 == str4) {NSLog(@"str1 == str2");}[muArray removeObject:str3];for (NSObject * object in muArray) {NSLog(@"数组对象:%@", object);}[str1 release];[str2 release];}return 0;
}
打印结果
2012-07-09 14:57:52.059 objectiveC[2399:403] 数组对象:对象
2012-07-09 14:57:52.061 objectiveC[2399:403] 数组对象:字符串
2012-07-09 14:57:52.062 objectiveC[2399:403] 数组对象:字符串
2012-07-09 14:57:52.062 objectiveC[2399:403] str1 isEqual str2
2012-07-09 14:57:52.063 objectiveC[2399:403] 数组对象:对象
这时,数组里的两个“字符串”对象都被去除了。
现在试试 removeObjectIdenticalTo
代码改成: [muArray removeObjectIdenticalTo:str3];
打印结果
2012-07-09 14:59:53.520 objectiveC[2432:403] 数组对象:对象
2012-07-09 14:59:53.521 objectiveC[2432:403] 数组对象:字符串
2012-07-09 14:59:53.522 objectiveC[2432:403] 数组对象:字符串
2012-07-09 14:59:53.523 objectiveC[2432:403] str1 isEqual str2
2012-07-09 14:59:53.523 objectiveC[2432:403] 数组对象:对象
2012-07-09 14:59:53.524 objectiveC[2432:403] 数组对象:字符串
数组中有个还有一个“字符串”留下来了。证明removeObjectIdenticalTo是通过对象的地址做判断的,
我们用对比两个对象isEqual,用==对比对象的地址,打印出来了str1 isEqual str2
inRange的使用
NSRange rang = NSMakeRange(0, 3);[muArray removeObject:obj inRange:rang];
指定范围删除对象,其他方法也可以指定范围删除,如果对象不在这个范围内,则不会被删除。
4.3、替换某索引值对应的对象
int main(int argc, const char * argv[])
{@autoreleasepool {NSObject *obj = [[NSObject alloc]init]; NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];[muArray addObject:@"对象1"];[muArray addObject:@"对象2"];[muArray addObject:@"对象3"];[muArray addObject:@"对象4"];[muArray addObject:obj];for (NSObject * object in muArray) {NSLog(@"数组对象:%@", object);}[muArray replaceObjectAtIndex:4 withObject:@"字符串替换回来"];for (NSObject * object in muArray) {NSLog(@"数组对象:%@", object);}[obj release];}return 0;
}
替换后打印结果
2012-07-09 15:06:01.919 objectiveC[2497:403] 数组对象:对象1
2012-07-09 15:06:01.920 objectiveC[2497:403] 数组对象:对象2
2012-07-09 15:06:01.920 objectiveC[2497:403] 数组对象:对象3
2012-07-09 15:06:01.921 objectiveC[2497:403] 数组对象:对象4
2012-07-09 15:06:01.921 objectiveC[2497:403] 数组对象:字符串替换回来
4.4、数组迭代的遍历方法
int main(int argc, const char * argv[])
{@autoreleasepool {NSObject *obj = [[NSObject alloc]init]; NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];[muArray addObject:@"对象1"];[muArray addObject:@"对象2"];[muArray addObject:@"对象3"];[muArray addObject:@"对象4"];[muArray addObject:obj];NSEnumerator *enmuerator = [muArray objectEnumerator];id object;while (object = [enmuerator nextObject]) {NSLog(@"数组中的对象:%@", object);}[obj release];}return 0;
}
打印结果
2012-07-09 16:00:26.153 objectiveC[2691:403] 数组中的对象:对象1
2012-07-09 16:00:26.154 objectiveC[2691:403] 数组中的对象:对象2
2012-07-09 16:00:26.155 objectiveC[2691:403] 数组中的对象:对象3
2012-07-09 16:00:26.155 objectiveC[2691:403] 数组中的对象:对象4
2012-07-09 16:00:26.156 objectiveC[2691:403] 数组中的对象:<NSObject: 0x7f91f8414110>
4.5、NSSet和NSMutableSet是无序的, 但是它保证数据的唯一性。当插入相同的数据时,不会有任何效果。从内部实现来说是hash表,所以可以常数时间内查找一个数据。
1、NSSet的使用
[NSSet setWithSet:(NSSet *)set]; 用另外一个set对象构造[NSSet setWithArray:(NSArray *)array];用数组构造
[NSSet setWithObjects:...]:创建集合对象,并且初始化集合中的数值,结尾必需使用nil标志。
[set count] ; 得到这个结合对象的长度。
[set containsObject:...]: 判断这个集合中是否存在传入的对象,返回Bool值。
[set objectEnumerator]: 将集合放入迭代器。
[enumerator nextObject]:得到迭代器中的下一个节点数据,使用while遍历这个迭代器,方可遍历集合对象中的对象。
[set isEqualToSet:objset]:判断两个集合是否完全相等,返回Bool值。
[set isSubsetOfSet:objset]:判断集合中的所有数据是否都相等与objeset集合中,返回Bool值。
[set allObjects];
2 以NSArray构造set
NSArray *array = [[NSArray alloc] initWithObjects:@"对象abc",@"rongfzh", @"totogo2010",nil];NSSet *set3 = [NSSet setWithArray:array];NSLog(@"%@", set3);
打印
2012-07-10 09:39:02.015 objectiveC[720:403] {(rongfzh,"\U5bf9\U8c61abc",totogo2010
)}
3 set的一些比较方法的使用
int main(int argc, const char * argv[])
{@autoreleasepool {NSSet *set = [NSSet setWithObjects:@"25",@"age",@"张三",@"name",@"男",nil];NSSet *set1 = [NSSet setWithObjects:@"25",@"age",@"张三",@"name",@"男",@"性别",nil];NSLog(@"set count:%lu", [set count]);//判断是否含有age字符串if([set containsObject:@"age"]) {NSLog(@"set包含age");}//判断set 是否等于set1if ([set isEqualToSet:set1]) {NSLog(@"set 等于 set1");}//判断set是否是否是set1的子集合if ([set isSubsetOfSet:set1]) {NSLog(@"set isSubsetOfSet set1");}//获取所有set对象NSArray *array = [set allObjects];NSLog(@"array:%@", array);//迭代遍历NSEnumerator *enumerator = [set objectEnumerator];for (NSObject *object in enumerator) {NSLog(@"set1里的对象:%@", object);}}return 0;
}
打印结果
2012-07-10 09:50:32.018 objectiveC[939:403] set count:5
2012-07-10 09:50:32.020 objectiveC[939:403] set包含age
2012-07-10 09:50:32.021 objectiveC[939:403] set isSubsetOfSet set1
2012-07-10 09:50:32.023 objectiveC[939:403] array:(age,25,"\U7537","\U5f20\U4e09",name
)
2012-07-10 09:50:32.027 objectiveC[939:403] set1里的对象:age
2012-07-10 09:50:32.028 objectiveC[939:403] set1里的对象:25
2012-07-10 09:50:32.028 objectiveC[939:403] set1里的对象:男
2012-07-10 09:50:32.029 objectiveC[939:403] set1里的对象:张三
2012-07-10 09:50:32.029 objectiveC[939:403] set1里的对象:name
4.6、NSMutableSet的使用
NSMutableSet继承NSSet,它可以使用NSSet的方法。
[NSMutableSet setWithCapacity:6]:创建可变集合对象,并且初始化长度为6。
[set addObject: obj] : 向集合中动态的添加对象。
[set removeObject:obj]:删除集合中的一个对象。
[set removeAllObjects]:删除集合中的所有对象。
[set unionSet:obj]:向集合中添加一个obj集合的所有数据。
[set minusSet:obj]:向集合中删除一个obj集合的所有数据。
[set intersectSet]:向集合中删除一个不包含obj集合的所有数据。
int main(int argc, const char * argv[])
{@autoreleasepool {NSMutableSet *muSet = [NSMutableSet setWithCapacity:6];[muSet addObject:@"对象1"];NSSet *set = [NSSet setWithObjects:@"对象2",@"对象3", @"被企鹅咬了一口", nil];//添加set数据[muSet unionSet:set];for (NSObject *object in muSet) {NSLog(@"all nuSet:%@",object);}NSSet *set1 = [NSSet setWithObjects:@"对象2",@"对象3", nil];//在muSet中删除包含set1总数据[muSet minusSet:set1];for (NSObject *object in muSet) {NSLog(@"after minusSet:%@",object);}}return 0;
}
打印结果
2012-07-10 10:09:08.194 objectiveC[1156:403] all nuSet:对象1
2012-07-10 10:09:08.196 objectiveC[1156:403] all nuSet:被企鹅咬了一口
2012-07-10 10:09:08.196 objectiveC[1156:403] all nuSet:对象2
2012-07-10 10:09:08.197 objectiveC[1156:403] all nuSet:对象3
2012-07-10 10:09:08.198 objectiveC[1156:403] after minusSet:对象1
2012-07-10 10:09:08.198 objectiveC[1156:403] after minusSet:被企鹅咬了一口
这篇关于Objective-c 语法之集合NSDictionary NSSet NSArray的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!