• iOS学习16之OC集合遍历和数组排序


    1、集合遍历

     1> 遍历

      集合(Collection):OC中提供的容器类:数组字典集合

      遍历:对集合中元素依次取出的过称叫做遍历。

      三种方式:① for循环遍历; ② NSEnumerator遍历; ③ for...in遍历

     2> for循环遍历

      ① 数组遍历

       原理:通过for循环的循环变量用作数组元素下标来获取不同下标的元素。

       循环次数就是数组元素的个数。

    1 // 数组
    2 for (int i = 0; i < arr.count; i++) {
    3     NSLog(@"%@", arr[i]);
    4 }

      ② 字典遍历

       原理:先获取字典中所有的key,存储到数组中,遍历数组依次取出每一个key,然后根据key从字典中取出对应的value

       循环次数就是字典元素的个数。

    1         // 字典
    2         // 获取字典中所有的key值
    3         NSArray *allKey = [dict allKeys];
    4         // 遍历key值数组,访问对应的object值
    5         for (int i = 0; i < allKey.count; i++) {
    6             NSString *key = allKey[i];
    7             NSLog(@"%@", [dict objectForKey:key]);
    8         }

      ③ 集合遍历

       原理:用集合的allObjects属性先取到集合的所有元素存储到数组中,再通过for循环的循环变量用作下标来取到每个元素。

    1         // 集合
    2         // 取出集合中的所有元素放到数组中
    3         NSArray *setArray = [set allObjects];
    4         for (int i = 0; i < setArray.count; i++) {
    5             NSLog(@"%@", setArray[i]);
    6         }

     3> NSEnumerator

      ① 概述 

       枚举器,遍历集合中的元素。

       依附于集合类(NSArray,NSSet,NSDictionary),没有用来创建实例的接口

       NSEnumeratornextObject 方法可以遍历每个集合元素,结束返回 nil ,通过与 while 结合使用可遍历集合中所有元素。

       对可变集合(数组,字典,集合)进行枚举操作时,不能通过添加或删除对象这类方式来改变集合容器的元素个数

      ② 数组遍历

       正序(objectEnumerator)

    1         // 数组(正序)
    2         // 创建正序的枚举器对象
    3         NSEnumerator *arrayEnum1 = [arr objectEnumerator];
    4         id value1 = nil;
    5         // 判断value部位空打印数据
    6         while ((value1 = [arrayEnum1 nextObject])) {
    7             NSLog(@"%@", value1);
    8         }    

       倒序(reverseObjectEnumerator)

    1         // 数组(倒序)
    2         // 创建倒序的枚举器对象
    3         NSEnumerator *arrayEnum2 = [arr reverseObjectEnumerator];
    4         id value2 = nil;
    5         while ((value2 = [arrayEnum2 nextObject])) {
    6             NSLog(@"%@", value2);
    7         }

      注:枚举器的nextObject方法只能取出一个对象,所以需要和while循环结合把所有元素依次取出

      ③ 字典遍历

    1         // 字典
    2         // 遍历到的是字典中的value值
    3         NSEnumerator *dictEnum = [dict objectEnumerator];
    4         id value3 = nil;
    5         while ((value3 = [dictEnum nextObject])) {
    6             NSLog(@"%@", value3);
    7         }

      注:字典中存放的数据是无序的没有反向枚举的概念

      ④ 集合遍历

    1         // 集合
    2         NSEnumerator *setEnum = [set objectEnumerator];
    3         id value4 = nil;
    4         while ((value4 = [setEnum nextObject])) {
    5             NSLog(@"%@", value4);
    6         }

      注:集合中存放的数据是无序的,没有反向枚举的概念

     4> for...in 遍历

      ① 概述

       for...in:快速枚举,是在NSEnumerator的基础上封装的更加方便的快速的遍历集合元素的方式。

       格式:for (集合中对象的类型 * 元素名 in 被遍历的集合) {

          语句;

           }

       对可变集合(数组,字典,集合)进行快速枚举操作时,不能通过添加删除对象这类方式来改变集合容器的元素个数

      ② 数组遍历

    1         // 数组
    2         for (id value in arr) {
    3             NSLog(@"%@", value);
    4         }

      ③ 字典遍历

    1         // 字典 遍历的是字典的key
    2         for (id value in dict) {
    3             NSLog(@"%@", dict[value]);
    4         }

      ④ 集合遍历

    1         // 集合
    2         for (id value in set) {
    3             NSLog(@"%@", value);
    4         }

    2、数组排序

     数组是有序容器,因此集合中只有数组才能排序。

     1> NSSortDescriptor(排序描述符)概述

      该类能够方便的实现对数组中的对象进行升序或者降序的排序。

      它可以把元素的某个属性作为key进行升序降序的排序,每个NSSortDescriptor对象就是一个排序条件

     2> NSSortDescriptor创建方法

      初始化方法

      - (instancetype)initWithKey:(NSString *)key ascending:(BOOL)ascending;

      key:按照数组中对象的哪个属性进行排序,如果数组中存放的是能够直接排序的对象(比如:字符串),直接使 @"self" 或者 nil 即可;如果存放的是自定义类的对象,使用想要进行排序的属性名即可(比如:想按照Person类的name进行排序, 使用 @"name" 作为参数)。
           ascending:排序的标志,是升序还是降序。 YES - 升序, NO - 降序。

    NSSortDescriptor创建

    1 NSSortDescriptor *sortDes1 = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; // 升序
    2 NSSortDescriptor *sortDes2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; // 降序

      ① 不可变数组

    排序

    1 // 基本数据类型不可变数组
    2 array = [array sortedArrayUsingDescriptors:@[sortDes1]];
    3 NSLog(@"%@", array);
    4 // 自定义对象不可变数组
    5 // 按照名字排序
    6 personArray = [personArray sortedArrayUsingDescriptors:@[sortDes2]];
    7 NSLog(@"%@", personArray);

     ② 可变数组

    排序

    1 // 基本类型可变数组
    2 [mArray sortUsingDescriptors:@[sortDes1]];
    3 NSLog(@"%@", mArray);
    4 // 自定义对象可变数组
    5 // 按照名字排序
    6 [personMArray sortUsingDescriptors:@[sortDes2]];
    7 NSLog(@"%@", personMArray);

     3> 使用数组中 两个元素比较的方法名 进行排序

      ① 不可变数组排序:(排序结果生成新数组, 原数组无改变)

       - (NSArray *)sortedArrayUsingSelector:(SEL)comparator;

       注:SEL类型的参数comparator:需要传入一个返回结果是NSComparisonResult的方法名。

    1 // 不可变数组(基本数据类型)
    2 array = [array sortedArrayUsingSelector:@selector(compare:)];
    3 NSLog(@"%@", array);
    4 // 不可变的数组(自定义类型的对象)
    5 // 按照名字排序
    6 personArray = [personArray sortedArrayUsingSelector:@selector(compareByName:)]; // compareByName为Person类中自定义的方法
    7 NSLog(@"%@", personArray);

      ② 可变数组排序:(直接对原数组操作,无新数组生成)

       - (void)sortUsingSelector:(SEL)comparator;

       注:SEL类型的参数comparator:需要传入一个返回结果是NSComparisionResult的函数

    1 // 可变数组(基本数据类型)
    2 [mArray sortUsingSelector:@selector(compare:)];
    3 NSLog(@"%@", mArray);
    4 // 可变的数组(自定义类型的对象)
    5 // 按照名字排序
    6 [personMArray sortUsingSelector:@selector(compareByName:)];
    7 NSLog(@"%@", personMArray);

      Person类中compareByName方法:

    1          // 比较方法的声明
    2          - (NSComparisonResult)compareByName:(Person *)anotherPerson;
    3          // 比较方法的实现
    4          - (NSComparisonResult)compareByName:(Person *)anotherPerson {
    5          return [self.name compare:anotherPerson.name];
    6          }
  • 相关阅读:
    Dig out deleted chat messages of App Skype
    Search history in "Maps"
    如何对具有端点加密功能的LINE进行取证
    HttpHandler实现网页图片防盗链
    自定义文本验证控件
    MySQL查询本周、上周、本月、上个月份数据的sql代码
    org.hibernate.NonUniqueObjectException
    Struts2 中的值栈的理解
    struts2中struts.xml配置文件详解
    基于Struts自定义MVC-2
  • 原文地址:https://www.cnblogs.com/gfxxbk/p/5322994.html
Copyright © 2020-2023  润新知