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. Ant快速入门(一)-----Ant介绍

    Ant是一种基于Java的生成工具.从作用上来看,它类似于C编程(UNIX平台上使用比较多)的Make工具,C/C++项目经常使用Make工具来管理整个项目的编译,生成 Make使用Shell命令来定 ...

  2. 【HDOJ】1053 Entropy

    构造huffman编码,果断对字符进行状态压缩. #include <iostream> #include <cstdio> #include <cstring> ...

  3. 国内大学毕业论文LaTeX模板集合

    国内大学毕业论文LaTeX模板集合 薛瑞尼的清华大学学位论文LaTeX模板http://sourceforge.net/projects/thuthesis/ 北大论文文档 LaTeX 模板 pkut ...

  4. SDUT2087 离散事件模拟-银行管理(模拟)

    题目链接. 分析: 模拟. 果然模拟什么的最讨厌了. 用e1,e2分别记录队列1,队列2的结束时间. 每个结点的s记录开始时间,e一开是记录逗留时间,进队列的时候,改成离开的时间.时刻记录总时间就可以 ...

  5. COJN 0485 800503寻找平面上的极大点

    800503寻找平面上的极大点 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个平面上,如果有两个点(x,y),(a,b) ...

  6. Linux下samba的安装与配置

    背景          在window7下面虚拟了一个CentOS6.3,为了学习命令行就没有装图形包,所以我的CentOS是黑屏的那种,呵呵,当然了,VMWare提供 的增强功能我就不能用了(或许能 ...

  7. linux chgrp命令【转载】

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  8. Hbase 设计与开发实战

    Hbase 概述 大数据及 NoSQL 的前世今生 传统的关系型数据库处理方式是基于全面的 ACID 保证,遵循 SQL92 的标准表设计模式(范式)和数据类型,基于 SQL 语言的 DML 数据交互 ...

  9. Hadoop集群与RAID磁盘阵列

    Hadoop集群规范 硬盘选型 尽管建议采用RAID(Redundant Array of Independent Disk,即磁盘阵列)作为NameNode的存储器以保护元数据,但是若将RAID作为 ...

  10. 同时安装Xcode6和Xcode7导致出现N多UUID 模拟器解决办法

    [摘要:1.完整退出Xcode 和 摹拟器 2.末端中输进以下两居指令 $ sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService$ ...