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

来源:互联网 发布:淘宝差评在哪里解释 编辑:程序博客网 时间:2024/05/29 18:52

  • 一字典类
  • 二集合类
  • 三数组字典集合的快速遍历
  • 四数组排序
  • 五数组元素按照数值大小排序

一、字典类

字典⽤于保存具有映射关系(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
原创粉丝点击