Object C学习笔记13-Dictionary字典

  通过Array数组和Set集合的学习和理解,可以想象得到Dictionary也分为两种情况了,那就是可变和不可变两种类型的。的确如此,在Object C中提供了两个字典类,分别为NSDictionary 和 NSMutableDictionary. 在.NET中我们也学习过Dictionary类,这个集合的存储方式是键值对的方式存储的。而且使用Dictionary查找元素也极为简单。

 

  一 NSDictionary 不可变字典

    (1) 初始化字典

NSDictionary *dic=[NSDictionary dictionaryWithObject:@"hechen" forKey:@"name"];
        NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:@"hechen",@"name",@"25",@"age", nil];
        NSDictionary *dic2=[[NSDictionary alloc] init];

        NSLog(@"%d",[dic count]);
        NSLog(@"%d",[dic1 count]);
        NSLog(@"%d",[dic2 count]);
        

    上面列举了三种方式来初始化字典对象:

    1. [[NSDictionary alloc] init] 方法最为常见了,先给NSDictionary分配空间再初始化,这也是大众的方式;

    2. 使用dictionaryWithObject forkey 该方法在初始化的时候提供了两个参数,第一个为存储的值,第二个为key,这个和我们平时在.NET中有点不一样的,这里的key是放在后面的。

    3. 使用dictionaryWithObjectsAndKeys 这个方法同样用于初始化NSDictionary,这里可以传入多个值,奇数为value值,偶数为key值,但是必须以nil形式结尾。这个和之前的NSArray,NSSet一致,标识集合的结束。

    (2)获得NSDictionary的长度

    NSDictionary的长度使用方法count方法来获得,这个和大多数集合一样

NSDictionary *dic=[NSDictionary dictionaryWithObject:@"hechen" forKey:@"name"];
        NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:@"hechen",@"name",@"25",@"age", nil];
        NSDictionary *dic2=[[NSDictionary alloc] init];

        NSLog(@"%d",[dic count]);
        NSLog(@"%d",[dic1 count]);
        NSLog(@"%d",[dic2 count]);
        

测试例子

    以上代码中获得了三个NSDictionary的长度,分别输出的结果为1,2,0;这里也刚好说明了上面三种方式初始化的不同之处。

    (3)获得NSDictionary中Keys的迭代

NSEnumerator *enumer=[dic1 keyEnumerator];
        NSString *key2=[enumer nextObject];
        while(key2!=nil){
            NSLog(@"输出Key=%@",key2);
            key2=[enumer nextObject];
        }

    以上代码可以看得出来使用keyEnumerator 方法获取NSDictionary Key的集合迭代,然后使用迭代器遍历输出所有的元素。

    (4)获取NSDictionary中的Values的迭代

NSEnumerator *enumerObject=[dic1 objectEnumerator];
        for(NSObject *object in enumerObject){
            NSLog(@"输出Value = %@",object);
        }

测试案例

    获取Value的方法和获取key的方法基本类似,这里在循环遍历的时候有些不同,但是两者的结果是一样的,可以稍微注意一下

    (5)根据Key获取Value

NSString *va=[dic1 objectForKey:@"name"];
        NSLog(@"objectForKey = %@",va);

    在Object C通过key获取Value要使用方法objectForKey,在上面的案例中已经简单而且明确的展示了其用法。

 

  二. NSMutableDictionary 动态字典

    NSMutableDictionary 是NSDictionary的子类,继承了其所有的方法和属性。但是和NSDictionary有着一定的区别就是NSMutableDictionary可以动态的修改和增加删除里面的元素。

    (1) dictionaryWithCapacity方法设置其初始容量

NSMutableDictionary *muDic1=[NSMutableDictionary dictionaryWithCapacity:10];

    上面的代码中初始化了一个NSMutableDictionary对象,并且设置其初始容量为10; 和NSMutableArray,NSMutableSet一样,当存储的元素达到最大容量之后会自动扩充容量,所以不用担心数组越界。

    (2) 往NSMutableDictionary中添加元素

[muDic1 setObject:@"中国" forKey:@"name"];
        [muDic1 setObject:@"area" forKey:@"add"];
        NSEnumerator *enumerKeys=[muDic1 keyEnumerator];
        for(NSString *key in enumerKeys){
            NSString *value=[muDic1 objectForKey:key];
            NSLog(@"输出的值 = %@",value);
        }

    从以上代码可以看到使用 setObject forKey 方法可以往字典中添加元素, 方法的前一个参数为value,后一个参数为key。使用循环可以得到相应的值。

    (3) 删除字典中的元素

[muDic1 removeObjectForKey:@"add"];
        for(NSString *key in [muDic1 keyEnumerator]){
            NSLog(@"-----%@",[muDic1 objectForKey:key]);
        }

    以上代码是根据一个key值来删除NSMutableDictionary中的元素,所使用的方法为removeObjectForKey,在NSMutableDictionary中还提供了根据多个key值删除的元素的方法。

    - (void)removeObjectsForKeys:(NSArray *)keyArray;这个方法参数为一个数组,用于删除数组中包含的key的所有元素。

[muDic1 removeObjectsForKeys:[NSArray arrayWithObjects:@"ab", nil]];

[muDic1 removeAllObjects];

for(NSString *key in [muDic1 keyEnumerator]){
    NSLog(@"*********%@",[muDic1 objectForKey:key]);
}

    上面第一句代码用于从数组中删除包含的元素,而第二句则用于删除NSMutableDictionary中的所有元素。最终没有任何结果输出。

 

    以上是关于字典的相关内容的简单介绍,系统提供的方法远不止这些,仍需要不断的去努力与实践,实践永远是最有效的方法。

 

    有人问我这学习Object C是要搞iphone开发的节奏啊,其实不是为了开发iPhone才学习Object C的,只是为了让自己还能静下心来去学习,好在实施过程中给客户交流还有扯淡的资本!

时间: 2024-10-24 11:53:51

Object C学习笔记13-Dictionary字典的相关文章

Object C学习笔记17-动态判断和选择器

当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关内容. 首先还是和.NET先对比一下,.NET中存在一个关键字var ,这个估计用过.NET的都知道,除非没有接触过3.0以上版本的.在.NET中能够使用var来声明任何类型的局部变量,负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量.但是这里要注意的时var 并不是一

Object C学习笔记10-静态方法和静态属性

在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此.在Object C中也存在static关键字,今天的学习过程使用到了这个关键字,在这里记录一下static的使用. 在Object C的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中 .不过可以调用这个类的方法间接的修改这个静态变量的值.对于Object C中的类使用和定义在前面已经做过相应

Object C学习笔记21-typedef用法

在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作用是给一个数据类型定义一个新的名称,这些类型报告内部数据类型,比如int,char 还有自定义类型struct,enum等. typedef一般有两个作用:(1) 给某种类型顶一个定义比较容易记的名字,相当于别名;(2)简化较为复杂的类型声明.   二. typedef的使用 1. 定义新类型 语法

spring学习笔记(13)基于Schema配置AOP详解

基于Schema配置入门实例 除了基于@AspectJ注解的形式来实现AOP外,我们还可以在IOC容器中配置.先来看看一个常见的应用场景,在我们的web项目中,我们需要为service层配置事务,传统的做法是在每个业务逻辑方法重复下面配置中: Created with Raphaël 2.1.0程序开始1. 获取DAO层封装好的数据库查询API,如HIbernate中的SessionFactory/Session和mybatis中的xxxMapper2. 开启事务3. 根据入参查询数据库完成相应

Object C学习笔记15-协议(protocol)

在.NET中有接口的概念,接口主要用于定义规范,定义一个接口关键字使用interface.而在Object C 中@interface是用于定义一个类的,这个和.NET中有点差别.在Object C中有一个协议(protocol) 的概念,这个和.NET中的interface类似. 协议(Protocol) 在列出的方法在本类中并没有相应实现,而是别的类来实现这些方法,而定义协议必须使用protocol关键字.   一. 如何定义protocol的定义 如何使用XCode新建一个协议.h 文件

API Demos 2.3 学习笔记 (13)-- Views->Seek Bar

更多精彩内容,请点击阅读:<API Demos 2.3 学习笔记> SeekBar 是基于ProgressBar的扩展,可以理解为添加了滑动条的ProgressBar.用户可以左右移动滑动条或者左右移动轨迹球来设置当前的进度值.最好不要在SeekBar左边或者右边放置一个可以聚焦的控件. SeekBar 控件最经典的应用是在播放器中用于显示/改变播放进度的进度条.下面是一个简单的SeekBar 控件: <SeekBar android:id="@+id/seek" a

Object C学习笔记8-字符串NSString之二

5. 字符串是否包含 hasPrefix 判断字符串是否以某个字符串开头 hasSuffix 判断字符串是否以某个字符串结尾 NSString *str1=@"Object C学习正在进行中.... LOVE"; if([str1 hasPrefix:@"Object"]){ NSLog(@"字符串:%@是以%@开头",str1,@"Object"); } if([str1 hasSuffix:@"LOVE"

Object C学习笔记9-字符串NSMutableString

  NSMutableString类继承自NSString,所以在NSString中的方法在NSMutableString都可以使用. NSMutableString和NSString的区别在于NSMutableString是动态的字符串,可以动态的添加,修改,删除等.在前面提到了就和.NET中的string和StringBuilder的区别一样.   1. 添加字符串 向字符串末尾添加字符串可以使用appendString方法和appendFormat方法.appendString方法主要用于

Object C学习笔记23-继承,重写,重载

前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下. 一.  继承 在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在Object C中也同样如此. 先定义一个Person类,并且定义几个属性和一个方法: #import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *name; int age; NSArray *itmes;