Objective-C_字典、集合、数组排序

一、字典类

字典⽤于保存具有映射关系(key-value对)数据的集合。对于“姓名:张三”来讲,key就是“姓名”,key对应的value是“张三”。一个key-value对认为是⼀个条目,字典是存储key-value对的容器。与数组不同,字典靠key存取元素。key不能重复,value必须是对象。键值对在字典中是无序存储的。字典也分为,不可变字典(NSDictionary)和可变字典(NSMutableDictionary)。

NSDictionary,不可变字典,继承NSObject。即字典一旦创建,键值对就不可更改,不可添加,不可删除。仅能读取key或者value。

        /* 不可变字典 */
        /* 创建对象 */
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"ZhangSan", @"name",
                             @"Man", @"sex",
                             @"18", @"age",
                             @"130", @"weight",
                             nil];

        /* 输出字典 */
        NSLog(@"%@", dic);

        /* 获取所有的Key值 */
        [dic allKeys];
        NSLog(@"%@", [dic allKeys]);

        /* 获取所有的Value值 */
        [dic allValues];
        NSLog(@"%@", [dic allValues]);

        /* 通过Key查询Value值 */
        [dic objectForKey:@"name"];
        NSLog(@"%@", [dic objectForKey:@"name"]);

        [dic valueForKey:@"name"];
        NSLog(@"%@", [dic valueForKey:@"name"]);

        /* 遍历字典 */
        NSArray *keyArr = [dic allKeys];
        for (int i = 0; i < keyArr.count; i++) {
            NSString *keyStr = [keyArr objectAtIndex:i];
            NSLog(@"%@", [dic objectForKey:keyStr]);
        }

        /* 快速遍历 */
        for (NSString *key in dic) {
            NSLog(@"%@", [dic objectForKey:key]);
        }

        /* keyArr快速遍历 */
        for (NSString *str in keyArr) {
            NSLog(@"%@", str);
        }

NSMutableDictionary,可变字典,继承NSDictionary。可以对管理的键值对进⾏行增、删、改。

        /* 可变字典 */
        NSMutableDictionary *mDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                     @"LiSi", @"name",
                                     @"18", @"age",
                                     @"woman", @"sex",
                                     @"120", @"weight",
                                     nil];
        for (NSString *key in mDic) {
            NSLog(@"%@", [mDic objectForKey:key]);
        }

        /* 增加键值对 */
        [mDic setObject:@"170cm" forKey:@"height"];
        [mDic setValue:@"volleyball" forKey:@"hobby"];

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

        /* 修改键值对 */
        [mDic setObject:@"20" forKey:@"age"];
        for (NSString *key in mDic) {
            NSLog(@"%@", [mDic objectForKey:key]);
        }

        /* 删除键值对 */
        [mDic removeObjectForKey:@"hobby"];
        for (NSString *key in mDic) {
            NSLog(@"%@", [mDic objectForKey:key]);
        }

二、集合类

集合类*NSSet,类似数学中集合的概念,具有确定性、无序性、互异性*。即集合中存储的元素必须是对象类型,存储的元素是无顺序的,存储的元素唯一。集合类也分为NSSet和NSMutableSet。

NSSet的示例代码如下:

        /* 不可变Set */
        /* 创建 */
        NSSet *set = [NSSet setWithObjects:@"四平", @"长春", @"吉林", @"四平", nil];

        /* 获取Set元素个数 */
        NSLog(@"%lu", set.count);

        /* 获取Set中某一元素 */
        NSLog(@"%@", [set anyObject]);

        /* 判断Set中是否包含某一个对象 */
        if ([set containsObject:@"沈阳"]) {
            NSLog(@"有");
        }
        else {
            NSLog(@"无");
        }

        /* 遍历集合 */
        for (NSString *str in set) {
            NSLog(@"%@", str);
        }

NSMutableSet的示例代码如下:

        /* 可变集合 */
        NSSet *set2 = [NSSet setWithObjects:@"DaLian", @"BeiJing", nil];
        NSMutableSet *mSet = [NSMutableSet setWithSet:set2];

        /* 合并两个集合 */
        [mSet unionSet:set];
        for (NSString *str in mSet) {
            NSLog(@"%@", str);
        }

        /* 相交两个集合 */
        [mSet intersectSet:set];

        /* 添加元素 */
        [mSet addObject:@"通化"];

        /* 删除元素 */
        [mSet removeObject:@"BeiJing"];
        for (NSString *str in mSet) {
            NSLog(@"*%@*", str);
        }        

NSCountedSet是NSMutableSet的子类,能记录元素的重复次数。在NSSet的基础上添加了计数功能。

NSCountedSet的示例代码如下:

        /* NSCountedSet类 */
        NSArray *arr = [NSArray arrayWithObjects:@"Zhang", @"LiSi", @"LiSi", @"Wang", @"Wang", @"LiSi", nil];
        NSCountedSet *countSet = [NSCountedSet setWithArray:arr];

        /* 查看countSet元素个数 */
        NSLog(@"%lu", countSet.count);

        /* LiSi计数 */
        NSLog(@"%lu", [countSet countForObject:@"LiSi"]);

三、数组、字典、集合的快速遍历

for (<#type *object#> in <#collection#>) {

}
  1. object是遍历得到的元素对象。
  2. collection是集合类型的对象:数组、字典、集合。

集合类型枚举的特点

  • 数组枚举得到数组中的元素对象
  • 字典枚举得到字典中的key值
  • 集合枚举得到集合中的元素对象
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"ZhangSan", @"name",
                             @"Man", @"sex",
                             @"18", @"age",
                             @"130", @"weight",
                             nil];

                             /* 快速遍历 */
        for (NSString *key in dic) {
            NSLog(@"%@", [dic objectForKey:key]);
        }

四、数组排序

数组排序取决于判断条件,判断条件决定了排序的⽅式(升序、降序)。iOS为数组提供了排序⽅法,同时提供了接口让我们传递判断条件。

        NSMutableArray *mArr = [NSMutableArray arrayWithObjects:@"3", @"2", @"1", @"4", nil];

        /* 可变数组排序 */

        /* @selector --> 方法选择器, 获取方法名的意思.
         * compare: --> 数组中元素的方法(元素是字符串, compare是字符串的一个方法)
         */
        [mArr sortUsingSelector:@selector(compare:)];
        NSLog(@"%@", mArr);

        /* 不可变数组排序 */
        NSArray *arr = [NSArray arrayWithObjects:@"4", @"2", @"1", @"3", nil];
        NSArray *sortArr = [arr sortedArrayUsingSelector:@selector(compare:)];
        NSLog(@"%@", sortArr);

五、数组元素按照数值大小排序

数组中存储的元素是对象类型,如果存储的元素都是数值对象,按照上述方法排序就不能得到正确的结果。因此,需要使用NSNumberFormatter将字符串转化为NSNumber对象。具体实现代码如下:

#pragma mark - 数值数组排序
#if 1
        NSArray *arr = @[@"1", @"12", @"122", @"67", @"50", @"666"];

        NSMutableArray *numArr = [NSMutableArray array];

        for (NSString *string in arr) {
            //  NSNumberFormatter格式转化
            NSNumberFormatter *format = [[NSNumberFormatter alloc] init];
            //  NSString 转成 NSNumber
            NSNumber *num = [format numberFromString:string];
            [numArr addObject:num];
        }
        //  根据数组里元素的类型来调用相应的方法, 相当于排序中条件判断
        NSLog(@"%@", [numArr sortedArrayUsingSelector:@selector(compare:)]);
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值