NSDictionary与NSMutableDictionary

NSSet与NSMutableSte

字典

  字典:字典分为可变字典NSDictionary和不可变字典NSMutableDictionary.字典中的数据都是以键值对的形式保存的,键和值可以是任何对象,一般使用字符串作为键.

  使用字典可以大大提高我们编程的效率,下面让我们看一个用字典表示乐曲信息的例子.表示乐曲信息的结构基本都是一样的,但也有个别乐曲有所不同,例如有的乐曲的作者是多个人,有的乐曲有参考信息等.

  图(a)中,每个框包围的部分就是一个字典对象。一个乐曲的完整信息由多个字典对象构成,例如,可以通过name得到曲名,通过lyrics得到作词者,通过music得到作曲者.通过note得到备注.当然也有可能其中某一项是空的.

  在这个例子中,key和value都是字在串类型的对象,value由多个字符串构成的时候可以用()把它们括起来,这种情况下字典对象的值相当―个数组对象.另外,除了字符串之外,字典对象的值还支持任意对象.例如,也可以把歌曲的声音或视频定义为―个对象放人字典对象中.

  让我们再来看―个用字典对象表示大学教室的例子,如图(b)所示,和乐曲的例子一样,每个框包围的部分就是一个字典对象.关键字capacity用来表明教室可以装多少个人mic和screen用来表明教室是否配备了麦克和投影屏幕.数值类型的value既可以使用字符串也可以使用NSNumber来描述.

  在面向过程的语言中,一般使用下标或成员名来获取数组或结构体的值。字典对象的key和value都可以是对象类型.所以可扩展性非常高,可以用在各种环境下.

  字典的键必须是唯一的.另外,nil不能作为字典的键.

  字典对象的值可以是除了nil外的任意对象,也可以是数组对象或字典对象。

NSDictionary

  NSDictionary 字典继承自NSObject 是一个不可变的字典,字典中存储的元素都是以键值对的形式存在(key-value),数据存储是按照key1:value1 key2:value2 ...的形式进行存储.key值必须是唯一的,value值可以重复.字典中只能存放对象类型的数据,key值和value值必须是对象,且字典中存放的键值对是无序的.

  创建

  1. 创建一个空字典 init   便利构造器  dictionary

NSDictionary *dic = [[NSDictionary alloc] init];

NSDictionary *dic1 = [NSDictionary dictionary];

  2. 创建拥有键值对的字典   initWithObjectsAndKeys:

      便利构造器方法  dictionaryWithObjectsAndKeys:

NSDictionary *dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:", @"age", @"zhangSan", @"name", @"yao", @"gender", nil];
NSLog(@"%@", dic2);

  打印:

2015-11-30 13:01:40.306 Myself[1711:145326] {

age = 18;

gender = yao;

name = zhangSan;

}

  注意事项:

   1.的时候value值在前,key值在后

2. 字典是无序的

3. 字典在创建时以nil结尾

4. key值一般都是字符串对象,value值可以是任意的,但必须也是对象类型的

 

  3. 用一个已有的字典对象初始化另一个字典  initWithDictionary:

   便利构造器方法  dictionaryWithDictionary:

NSDictionary *dic3 = [[NSDictionary alloc] initWithDictionary:dic2];

  4.访问

1. 获取字典中键值对的数量  count
NSInteger dCount =. 获取字典中所有的key值 .allKeys
NSArray *keyArray  = dic3.allKeys;

. 获取字典中所有的value值  .allValues
NSArray *valueArray = dic3.allValues;

. 根据给定的key值返回对应的value值  objectForKey:
NSString *value = [dic3 objectForKey:@"age"];
NSLog(@"%@", value);    // 打印 18

  5. 遍历字典

  forin 遍历字典的时候,默认遍历的就是字典的key值

for (NSString *key in dic3) {

    NSString *value = [dic3 objectForKey:key];
    NSLog(@"%@ = %@", key, value);
}

  打印:

2015-11-30 13:13:57.952 Myself[1737:151680] age = 18

2015-11-30 13:13:57.952 Myself[1737:151680] name = zhangSan

2015-11-30 13:13:57.952 Myself[1737:151680] gender = yao

NSMutableDictionary

  NSMutableDictionary 可变字典,继承自 NSDictionary,管理的是可变键值对,相对于NSDictionary增加了删除,添加,修改的方法,随着字典中元素的变更,NSMutableDictionary会自动管理内存.

  创建

  创建并初始化一个长度为capacity的可变字典  initWithCapacity

  便利构造器方法 dictionaryWithCapacity

NSMutableDictionary *mDic = [[NSMutableDictionary alloc] initWithCapacity:];

NSMutableDictionary *mDic1 = [NSMutableDictionary dictionaryWithCapacity:];   

  增加和删除

  1. 添加键值对  setObject:<#(id)#> forKey:<#(id<NSCopying>)#>

[mDic setObject:@"wangMaZi" forKey:@"L"];

[mDic setObject:@"zhangSan" forKey:@"B"];

  2. 修改键值对  setObject:<#(id)#> forKey:<#(id<NSCopying>)#>

[mDic setObject:@"xiaoPing" forKey:@"B"];

NSLog(@"%@", mDic);

  注意:添加和修改键值对的方法是一样的,如果发现字典中没有对应的key值,此时就添加,如果发现字典中有相同key值存在,此时就覆盖,原因就是字典中key值是唯一的

  3. 根据key值删除键值对 removeObjectForKey:

[mDic removeObjectForKey:@"L"];

  4. 删除字典中所有的键值对   removeAllObjects

[mDic removeAllObjects];

NSSet

  Foundation框架中提供了NSSet,它是一组单值对象的集合.同NSArray不同,NSSet存储的是无序的对象,同一个对象也只能保存一个.

  集合的特点:

    1. 集合中的元素都是唯一的

    2. 集合中的元素都是无序的

    3. 集合中只能方对象类型的元素

  

  1. 创建一个空集 init  便利构造器方法 set

NSSet *set = [[NSSet alloc] init];

NSSet *set1 = [NSSet set];

  2. 创建一个拥有元素的集合  initWithObjects:

   便利构造器方法  setWithObjects:

 NSSet *set2 = [[NSSet alloc] initWithObjects:", nil];

  3. 用一个数组初始化集合对象  arrayWithObjects:

  若array中存在重复元素时,可以把数组中重复的元素剔除掉,在集合中只会保存一个.

NSArray *sArr = [NSArray arrayWithObjects:", nil];

NSSet *set3 = [NSSet setWithArray:sArr];

NSLog(@"%@", set3);

2015-11-30 14:37:46.206 Myself[1784:178830] {(

1,

4,

2,

5

)}

  访问

. 获取集合中元素的个数 count
NSInteger *sCount = set2.count;

. 获取集合中随机元素  anyObject
NSString *sValue = set2.anyObject;

. 获取集合中所有的元素 allObjects
NSArray *sArray = set2.allObjects;

 判断

 7. 判断集合中是否包含某个对象 containsObject:

BOOL isCountain = [set2 containsObject:"];

NSLog(@"%@", isCountain ? @"包含" : @"不包含");//包含

 8. 判断是不是子集 isSubsetOfSet:

NSSet *set4 = [NSSet setWithObjects:", nil];

NSSet *set5 = [NSSet setWithObjects:", nil];

BOOL isSub = [set5 isSubsetOfSet:set4];

NSLog(@"%@", isSub ? @"是子集" : @"不是子集");// 是子集

  9. 判断两个集合是否有交集 intersectsSet:

BOOL isInter = [set4 intersectsSet: set5];

NSLog(@"%@", isInter ? @"有交集" : @"没有交集");//有交集

   10. 判断两个集合是否相同 isEqualToSet:

BOOL isSame = [set4 isEqualToSet:set5];

NSLog(@"%@", isSame ? @"相同" : @"不相同");

  NSMutableSet

   NSMutableSet 可变的集合,继承自 NSSet

  1. 创建  setWithCapacity:

NSMutableSet *mSet = [NSMutableSet setWithCapacity:];

[mSet addObject:"];

[mSet addObject:"];

[mSet addObject:"];

NSLog(@"%@", mSet);

  2. 删除可变集合中的元素  removeObject:

[mSet removeObject:"];

NSLog(@"%@", mSet);

  3. 删除可变集合中所有的元素  removeAllObjects

[mSet removeAllObjects];

NSLog(@"%@", mSet);

总结:

1.有序的角度: 数组有序, 字典和集合都是无序的

     2.能否通过下标来访问: 数组可以, 字典和集合都不可以

     3.元素是否可以重复: 数组可以重复, 字典中key值不可以重复,value值可以重复, 集合中元素不可以重复

     4.打印的样式: 数组: () 字典: {} 集合:  {()}

注意:数组和字典经常结合起来使用;

Objective-C学习篇08—NSDictionary与NSSet的更多相关文章

  1. iOS系列 基础篇 08 文本与键盘

    iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集

    机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...

  3. js学习篇1--数组

    javascript的数组可以包含各种类型的数据. 1. 数组的长度 ,直接用 length 属性; var arr=[1,2,3]; arr.length; js中,直接给数组的length赋值是会 ...

  4. Objective -C学习笔记之字典

    //字典:(关键字 值) // NSArray *array = [NSArray array];//空数组 // NSDictionary *dictionary = [NSDictionary d ...

  5. Foundation框架之NSArray、NSDictionary、NSSet及其Mutable类型

    Foundation框架之NSArray.NSDictionary.NSSet及其Mutable类型 目录 概述——对Foundation框架集合类的理解 NSArray NSDictionary N ...

  6. Tomcat集群配置学习篇-----分布式应用

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  7. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  8. 《Mysql 公司职员学习篇》 第二章 小A的惊喜

          第二章 小A的惊喜  ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...

  9. Java多线程(学习篇)

    Java多线程:(学习篇) 1.什么是线程 2.线程状态 3.线程中断 4.线程交互 5.同步机制 6.锁机制 7.堵塞队列与堵塞栈 8.条件变量.原子量.线程池等 9.线性安全类和Callable与 ...

随机推荐

  1. bzoj2071: [POI2004]JAS

    Description 在Byteotia有一个洞穴. 它包含n 个洞室和一些隧道连接他们. 每个洞室之间只有一条唯一的路径连接他们. Hansel 在其中一个洞室藏了宝藏, 但是它不会说出它在哪. ...

  2. linux内核移植 I

    根据tx2440的文档, 目标也比较简单, 先编译成功, 再烧录, 根文件系统, busybox 这些. A. 准备 1. 解压tar, 修改根Makefile ARCH ?= arm CROSS_C ...

  3. 去除win8.1这台电脑中的6个库文件夹

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace,备份之后删除 wi ...

  4. KEIL C51之绝对地址定位

    单片机空间分配看*.M51文件,ARM,DSP空间分配看*.map文件 1.函数定位 假如要把C源文件 tools.c 中的函数 int BIN2HEX(int xx) { ... } 放在CODE ...

  5. 生产环境下,不建议用早期版本的Mono........

    一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来

  6. Android自定义ActionBar

    Android 3.0及以上已经有了ActionBar的API,可以通过引入support package在3.0以下的平台引用这些API,但这儿呢,完全自定义一个ActionBar,不用引入额外ja ...

  7. 【转】android 中如何限制 EditText 最大输入字符数

    原文网址:http://blog.csdn.net/fulinwsuafcie/article/details/7437768 方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:andr ...

  8. delphi读写文本文件

    delphi读写文本文件   在工作中遇到了这样一个问题,使用PLSQL将一个表的数据转化成一些列的insert语句存储到一个.sql文本中,我本来想使用access数据库中的查询视图一次执行这些语句 ...

  9. C#获取字符串生成图片后的长度

    1.    使用g.MeasureString()获得 使用MeasureString测量出来的字符宽度,总是比实际宽度大一些,而且随着字符的长度增大,貌似实际宽度和测量宽度的差距也越来越大了.查了一 ...

  10. HDU 3853 LOOPS

    题意:对于每一格,都可以往右走,原地不走,往下走,概率分别为a[i],b[i],c[i](每一个格子与其他格子的概率不一定相同).在R*C的棋盘上(输入数据保证不会走出棋盘),求从(0, 0)走到(R ...