zoukankan      html  css  js  c++  java
  • Objective-C中字典的使用方法总结

    在Objective-C中提供了两个类来实现字典,即NSDictionaryNSMutableDictionary。其中,NSMutableDictionary是NSDictionary的子类,它继承父类方法的同时又支持对数据进行插入和删除操作,它们共同实现了以“键值对”的方式存储数据。

    // Objective-C中实现的字典相比于其他语言而言,还有一个最大的不同:即同一个字典中可以保存不同类型的对象。

    字典类的存在就是为了解决大量数据中的查找问题,因为它是通过key直接找到value的,所以速度极快,避免了遍历所造成的效率低下问题。

    1 NSDictionary

    1.1 创建不可变字典

    可以使用类方法dictionaryWithObjectsAndKeys:创建并初始化字典,示例如下:

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                  @"val1", @"key1",
                                  @"val2", @"key2", nil];

    注意:在使用键值对初始化字典时,“值”在前,“键”在后,成对出现,各个参数之间使用逗号分隔,并且最后使用nil结束。使用以上方法创建的字典内存分布如下图所示:

    1.2 获取字典大小

    在执行字典操作之前,常常需要获取字典大小,也就是确定字典中“键值对”的数量,我们可以使用count消息,使用方法如下:

    int cnt = [dict count];

    该方法会返回一个NSInteger类型的变量,我们也可以直接使用int类型的变量接收。

    1.3 得到字典中所有的KEY

    对字典发送keyEnumerator消息可以返回一个枚举对象,其中存储了字典中所有的键:

    NSEnumerator *enumKeys = [dict keyEnumerator];
    for (NSObject *obj in enumKeys){
        NSLog(@"enumKey: %@", obj);
    }

    使用“for-in”语法可以实现可枚举对象的遍历,以上代码中的循环可以遍历所有键,并且输出:

    2016-07-24 10:03:11.873 OCTest[2547:94272] enumKey: key1
    2016-07-24 10:03:13.753 OCTest[2547:94272] enumKey: key2

    注意:如果我们直接使用"for-in"语法遍历字典对象,实际上也相当于对“键”的遍历。

    for (NSObject *obj in dict){
        NSLog(@"key in dict: %@", obj);
    }

    执行以上代码的输出为:

    2016-07-24 10:10:17.590 OCTest[2667:97958] key in dict: key1
    2016-07-24 10:10:17.590 OCTest[2667:97958] key in dict: key2

    1.4 遍历字典中的所有VALUE

    可以使用获取“键”类似的方法获取字典中的“值”,只需要对字典发送objectEnumerator消息即可:

    NSEnumerator *enumValues = [dict objectEnumerator];
    for (NSObject *obj in enumValues){
        NSLog(@"value in dict: %@", obj);
    }

    运行结果如下:

    2016-07-24 10:14:41.984 OCTest[2702:100424] value in dict: val1
    2016-07-24 10:14:41.984 OCTest[2702:100424] value in dict: val2

    1.5 根据KEY检索VALUE

    对于字典而言,最常见的操作就是查找了,也就是根据给定的KEY,检索对应的VALUE,方法如下:

    NSObject *value = [dict objectForKey:@"key1"];
    if (value != nil){
        NSLog(@"value in dict: %@", value);
    }

    运行结果如下:

    2016-07-24 10:20:09.012 OCTest[2736:103393] value in dict: val1

     2 NSMutableDictionary

    2.1 创建可变字典

    可变字典,就意味着我们可以在后续操作过程中向字典中添加或者删除“键值对”,因此,最开始的时候我们可以创建一个空字典,常用的方法有:

    NSMutableDictionary *mdict = [@{} mutableCopy];
    NSMutableDictionary *mdict = [NSMutableDictionary dictionary];

    以上两种方法都可以创建一个空的可修改字典。但是,后续再向其中追加数据时,需要不断的分配内存(懒汉模式)。当然,如果我们能够预知字典的规模,那么可以在创建它的时候就初始化它的大小(饿汉模式):

    NSMutableDictionary *mdict = [NSMutableDictionary dictionaryWithCapacity:10];

    以上方法也会创建一个空字典,但是不同之处在于它已经提前分配了足以容纳10个键值对内容的内存。

    注:因为NSMutableDictionary是NSDictionary的子类,当然也可以用它父类的dictionaryWithObjectsAndKeys:方法来创建可变字典。

    2.2 向字典中添加数据

    [mdict setObject:@"mval01" forKey:@"mkey01"];
    [mdict setObject:@"mval02" forKey:@"mkey02"];

    因为字典是无序的,因此不用指定插入的位置。如果字典中已经存在对应的KEY值,那么就直接替换掉该KEY对应的值,也就是相当于修改操作;如果不存在,则将该“键值对”添加到字典当中。

    2.3 删除字典中的数据

    [mdict removeObjectForKey:@"mkey01"];

    可以指定“键”的方式删除字典中对应的“键值对”,如果该Key不存在,则不做任何操作。你也可以使用下面的方法清空整个字典的数据:

    [mdict removeAllObjects];
  • 相关阅读:
    应用运筹学基础:组合优化 (6)
    应用运筹学基础:组合优化 (5)
    应用运筹学基础:组合优化 (4)
    应用运筹学基础:组合优化 (3)
    应用运筹学基础:组合优化 (2)
    应用运筹学基础:组合优化 (1)
    应用运筹学基础:线性规划 (5)
    The method of type must override a superclass method报错解决方式
    Json文件出现 Expected value at 1:0 问题的解决方法
    浅析XML和JSON的区别
  • 原文地址:https://www.cnblogs.com/xiaomanon/p/5700195.html
Copyright © 2011-2022 走看看