Objective-c 语法之集合NSDictionary NSSet NSArray

2024-05-28 18:58

本文主要是介绍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


4、NSMutableArray 可变数组

[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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011416

相关文章

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa