NSDictionary

字典相当于Java中的Map, 有key和value

//
//  main.m
//  NSDictionary
//
//  Created by rayln on 13-9-6.
//  Copyright (c) 2013年 rayln. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSDictionary *dic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil] forKeys:[NSArray arrayWithObjects:@"k1",@"k2",@"k3",@"k4", nil]];
        NSDictionary *dic2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil] forKeys:[NSArray arrayWithObjects:@"k1",@"k2",@"k3",@"k4", nil]];
        //包含的元素个数
        [dic count]; //返回4
        //比较2个字典是否相等
        [dic isEqualToDictionary:dic2];
        //根据key取出value	
        [dic objectForKey:@"k1"]; //输出a
        //字典写入文件中
        [dic writeToFile:@"/Users/rayln/Desktop/text.txt" atomically:YES];
        //从字典读取数据
        [NSDictionary dictionaryWithContentsOfFile:@"/Users/rayln/Desktop/text.txt"];
        //返回所有的key
        [dic allKeys];
        //返回所有的value
        [dic allValues];
        
#pragma mark - 用法
        //另一种声称dictionary方法
        NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:
                              @"v6", @"k6",
                              @"v1", @"k1",
                              @"v1", @"k2",
                              @"v1", @"k3",
                              @"v4", @"k4", nil];
        //返回包含value的所有key
        [dic3 allKeysForObject:@"v1"]; //输出[k1, k2, k3]
        //对应多个key找到多个value, notFoundMarker参数是表示如果找不到对应的key,则value值由notFoundMarker替代
        [dic3 objectsForKeys:[NSArray arrayWithObjects:@"k1", @"k2", @"k5", nil] notFoundMarker:@"notfound"]; //输出[v1, v1, notfound]
        
#pragma mark - 字典遍历
        //遍历所有key
        for (id key in dic3) {
            NSLog(@"%@", key);
            
        }
        
        //key的迭代器
        NSEnumerator *enumKey = [dic3 keyEnumerator];
        id key = nil;
        while (key = [enumKey nextObject]) {
            NSLog(@"key=%@", key);
        }
        
        //对象迭代器 不演示了!
        [dic3 objectEnumerator];
        
        //block遍历- stop表示是否停止循环 如果stop=YES, 则停止循环
        [dic3 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
            NSLog(@"block-%@=%@",key,obj);
        }];
        
#pragma mark - 字典排序
        //根据value进行排序,返回排好序的key的Array
        NSArray *arr = [dic3 keysSortedByValueUsingSelector:@selector(compare:)]; //返回[k3, k2, k1, k4, k6]
        //block排序,也是根据value进行排序,返回排好序的key的Array
        arr = [dic3  keysSortedByValueUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
            NSComparisonResult *result = [obj1 compare:obj2];
            return result;
        }];//返回[k3, k2, k1, k4, k6]
        
        NSLog(@"%@", arr);
        
#pragma mark - 内存管理
        //当字典有对象时,字典中每个对象都会做一次retain操作,当字典释放时就会做一次release操作
        
    }
    return 0;
}

	
`NSDictionary` 是 Objective-C 中用于存储键值对(Key-Value)的集合类,类似于其他语言中的 **哈希表(Hash Table)** 或 **字典(Dictionary)**。它提供了一种快速查找、插入和删除数据的方式。 --- ### 📌 基本介绍 - `NSDictionary` 是不可变的,一旦创建后不能修改内容。 - 如果需要修改内容,可以使用它的子类 `NSMutableDictionary`。 - 每个键(Key)必须是唯一的,且通常是 `NSString` 或 `NSNumber` 类型。 - 值(Value)可以是任意对象类型(如 `NSString`, `NSNumber`, 自定义对象等)。 --- ### ✅ 示例代码 #### 不可变字典(NSDictionary) ```objective-c NSDictionary *dict = @{ @"name": @"Tom", @"age": @(25), @"score": @(90.5) }; NSString *name = dict[@"name"]; // 获取值 NSLog(@"Name: %@", name); ``` #### 可变字典(NSMutableDictionary) ```objective-c NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; [mutableDict setObject:@"Jerry" forKey:@"name"]; [mutableDict setObject:@30 forKey:@"age"]; // 修改值 [mutableDict setObject:@95 forKey:@"score"]; // 删除键值对 [mutableDict removeObjectForKey:@"age"]; ``` --- ### 🔍 特性与优点 | 特性 | 说明 | |------|------| | **快速查找** | 基于 Hash 表实现,查找效率为 O(1) | | **键唯一性** | Key 必须唯一,重复的 Key 会被覆盖 | | **支持任意对象作为值** | 可以存储字符串、数字、数组、自定义对象等 | | **线程不安全** | 多线程下需自行加锁或使用并发容器 | --- ### 🧠 使用场景 - 快速查找数据,如 ID 到对象的映射 - 存储配置信息(如 JSON 解析后的数据) - 作为缓存机制的一部分 - 替代大量 if-else 或 switch-case 判断逻辑 --- ### ⚠️ 注意事项 1. **Key 不能为 nil**,否则会抛出异常。 2. **Value 可以为 nil**,但建议使用 `[NSNull null]` 表示空值。 3. **Key 必须实现 `hash` 和 `isEqual:` 方法**,否则无法正确存储。 4. **不要使用基本类型作为 Key**,如 `int`、`long`,应使用 `NSNumber` 包装。 --- ### ✅ 示例:用 `NSDictionary` 优化查找性能 ```objective-c NSMutableDictionary<NSNumber *, DMSDNCategoryTraffics *> *categoryMap = [NSMutableDictionary dictionary]; for (DMSDNCategoryTraffics *item in self.categories.categoryTraffics) { categoryMap[@(item.familyId)] = item; } // 快速查找 DMSDNCategoryTraffics *match = categoryMap[@(category.familyId)]; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值