Foundation框架: 9.OC中的集合类之四 - NSMutableDictionary的基本认识

前面我们讲了NSDictionary, 现在我们来讲一下它的子类NSMutableDictionary, 这个NSMutableDictionary和前面的NSMutableString, NSMutableArray是一样的原理, 都是可变的, 下面让我们来看看它是怎么运作的:





例子:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    
    [dic setObject:@"jim" forKey:@"name"];
    
    [dic setObject:@"18" forKey:@"age"];
    
    id obj = dic[@"name"];
    id obj2 = dic[@"age"];
    
    NSLog(@"obj = %@, obj2 = %@", obj, obj2);
    
    return 0;
}

打印出来的结果:
2015-02-05 23:18:15.963 9.NSMutableDictionary[4210:303] obj = jim, obj2 = 18




在前面我说过, 一个键就只能对应一个值, 那如果有一个键对应多个值会发生什么事呢? 下面来看看:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    
    [dic setObject:@"jim" forKey:@"name"];
    
    [dic setObject:@"18" forKey:@"age"];
    
    [dic setObject:@"30" forKey:@"age"];
    
    id obj = dic[@"name"];
    id obj2 = dic[@"age"];
    
    NSLog(@"obj = %@, obj2 = %@", obj, obj2);
    
    return 0;
}

打印出来的结果:
2015-02-05 23:20:12.871 9.NSMutableDictionary[4220:303] obj = jim, obj2 = 30

从上面的结果, 我们可以看到, 键不变, 改变的是值, 其实这是没错的, 无论是在NSDictionary中还是NSMutableDictionary里, 只要是有相同的键值对, 在后面的值会覆盖掉前面的值.





当然, 有添加那就肯定有删除的方法, 比如:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    
    [dic setObject:@"jim" forKey:@"name"];
    
    [dic setObject:@"18" forKey:@"age"];
    
    [dic removeObjectForKey:@"name"];
    
    NSLog(@"%@", dic);
    
    return 0;
}

打印出来的结果:
2015-02-05 23:23:36.041 9.NSMutableDictionary[4233:303] {
    age = 30;
}





遍历方法:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSDictionary *dic = @{@"name" : @"rose", @"age" : @"20"};
    
    NSArray *keys = [dic allKeys];
    
    for(int i = 0; i < dic.count; i++)
    {
        NSString *key =  keys[i];
        NSString *objes = dic[key];
        
        NSLog(@"%@ --- %@", key, objes);
    }
    
    return 0;
}

打印出来的结果:

2015-02-05 23:37:44.102 9.NSMutableDictionary[4272:303] name --- rose
2015-02-05 23:37:44.104 9.NSMutableDictionary[4272:303] age --- 20

里面的语法之前都有讲过, 这里就不多讲了, 想知道的话, 回去翻翻我之前的博文吧~~





block遍历:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSDictionary *dic = @{
                          @"name" : @"rose",
                          @"age" : @"20",
                          @"age1" : @"20",
                          @"age2" : @"20"};
        
    [dic enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@ --- %@", key, obj);
    }];
    
    return 0;
}

打印出来的结果:

2015-02-06 12:57:48.647 9.NSMutableDictionary[4473:303] age --- 20
2015-02-06 12:57:48.648 9.NSMutableDictionary[4473:303] age1 --- 20
2015-02-06 12:57:48.649 9.NSMutableDictionary[4473:303] age2 --- 20
2015-02-06 12:57:48.649 9.NSMutableDictionary[4473:303] name --- rose

看完这个block遍历, 你应该就明白我为什么会说Dictionary是没有顺序了, 回想一下我们的NSArray遍历, 在block的遍历中, 我们看到一个Index的一个参数, 而在NSDictionary中, 压根就没有这个参数, 所以我一直强调, Dictionary是没有顺序的.





这里补充一个NSDictionary的知识点, 一个Dictionary允许有多个相同的值存在, 但不允许有多个相同的键存在, 下面我们来看看:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSDictionary *dic = @{
                          @"name" : @"rose",
                          @"age" : @"20",
                          @"age1" : @"20",
                          @"age2" : @"20"};
    
    NSArray *keys = [dic allKeys];
    
    for(int i = 0; i < dic.count; i++)
    {
        NSString *key =  keys[i];
        NSString *objes = dic[key];
        
        NSLog(@"%@ --- %@", key, objes);
    }
    
    return 0;
}

打印出来的结果:

2015-02-06 12:17:34.997 9.NSMutableDictionary[4392:303] age --- 20
2015-02-06 12:17:34.999 9.NSMutableDictionary[4392:303] age1 --- 20
2015-02-06 12:17:35.000 9.NSMutableDictionary[4392:303] age2 --- 20
2015-02-06 12:17:35.000 9.NSMutableDictionary[4392:303] name --- rose

这里同样说明了另一个问题, 就是NSDictionary是没有顺序的, 看看例子看看打印出来的结果就知道了.





总结:

集合

1.NSArray\NSMutableArray

 * 有序

 * 快速创建(不可变):@[obj1, obj2, obj3]

 * 快速访问元素:数组名[i]

 

2.NSSet\NSMutableSet

 * 无序

 

3.NSDictionary\NSMutableDictionary

 * 无序

 * 快速创建(不可变):@{key1 : value1,  key2 : value2}

 * 快速访问元素:字典名[key]




好了, 这次就讲到这里, 下次我们继续~~


posted @ 2015-02-05 23:25  背着吉他去流浪  阅读(166)  评论(0编辑  收藏  举报