1、集合遍历

 1> 遍历

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

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

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

 2> for循环遍历

  ① 数组遍历

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

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

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

  ② 字典遍历

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

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

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

  ③ 集合遍历

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

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

 3> NSEnumerator

  ① 概述

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

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

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

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

  ② 数组遍历

   正序(objectEnumerator)

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

   倒序(reverseObjectEnumerator)

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

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

  ③ 字典遍历

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

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

  ④ 集合遍历

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

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

 4> for...in 遍历

  ① 概述

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

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

      语句;

       }

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

  ② 数组遍历

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

  ③ 字典遍历

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

  ④ 集合遍历

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

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]; // 降序

  ① 不可变数组

排序

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

 ② 可变数组

排序

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

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

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

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

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

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

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

   - (void)sortUsingSelector:(SEL)comparator;

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

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

  Person类中compareByName方法:

          // 比较方法的声明
- (NSComparisonResult)compareByName:(Person *)anotherPerson;
// 比较方法的实现
- (NSComparisonResult)compareByName:(Person *)anotherPerson {
return [self.name compare:anotherPerson.name];
}

iOS学习16之OC集合遍历和数组排序的更多相关文章

  1. iOS学习之Object-C语言集合遍历和数组排序

    一.集合遍历      1.集合:OC中提供的容器类,数组,字典,集合.      2.遍历:对集合中元素依次取出的过程叫做遍历. 二.for循环遍历      1.通过for循环的循环变量用作数组元 ...

  2. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  3. IOS学习之路--OC的基础知识

    1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouc ...

  4. 【IOS学习基础】OC类的相关

    几天前突然在别人的类的.m文件中看到这么一句代码:@synthesize xxxx = _xxxx; 当时愣是没理解啥意思,过后才缓过神来发现原来是把一些类的基础知识忘记了,虽然不用过多去深究以前的一 ...

  5. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  6. iOS学习14之OC NSNumber + NSValue

    1.NSNumber 数值类. 作用:实现基本数据类型与OC对象类型的相互转化. 1> NSNumber创建对象 // 初始化方法 NSNumber *num1 = [[NSNumber all ...

  7. iOS学习10之OC类和对象

    本次是OC的第一节课,主要是学习和理解类与对象 1.面向对象 1> OOP(Object Oriented Programming)面向对象编程. 面向对象以事物为中心,完成某件事情都需要哪些事 ...

  8. iOS学习之Object-C语言集合

    一.数组类      1.C语言数组的特点:数组是一个有序的集合,用来存储相同数据类型的元素,通过下标访问数组中的元素,下标从0开始.      2.OC中的数组只能存储对象类型(必须是NSObjec ...

  9. 【原】iOS学习18之OC内存管理高级

    1.属性的内存管理 1> 属性的语义特性 2> assign下的属性内部实现 @property (nonatomic, assign) NSString *name; @synthesi ...

随机推荐

  1. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十) 之 自定义系统消息和总结

    前言 本篇主要讲解一个东西,就是我们自定义系统消息.效果如下: 首先我们要做的准备工作就是改写 layim 的消息模板,如果不改的话就成为某个用户发送的消息了,那么体验就稍微差一些.找到模板我们看一下 ...

  2. 环境搭建及wamp空密码修改

    WAMP:快速搭建PHP环境的.Windows系统下.搭建虚拟的服务器环境.APPSERVER:同上. LAMP架构Linux系统Apache服务器管理软件Mysql数据库Php语言. 修改密码方法: ...

  3. tomcat和apache区别联系

    tomcat和apache区别联系 Apache是普通服务器,本身只支持html即普通网页.不过可以通过插件支持php,还可以与Tomcat连通(单向Apache连接Tomcat, 就是说通过Apac ...

  4. Android Programming: Pushing the Limits -- Chapter 6: Services and Background Tasks

    什么时候使用Service 服务类型 开启服务 后台运行 服务通信 附加资源 什么时候使用Service: @.任何与用户界面无关的操作,可移到后台线程,然后由一个Service来控制这个线程. 服务 ...

  5. execl一个工作薄中有几个个工作表,将这几个个工作表分别保存到不同execl文件中

    用宏运行: Sub QEJebel()    Dim sh As Worksheet    Dim Pa As String    Pa = ThisWorkbook.Path    For Each ...

  6. 【数据库】 防止sql注入,过滤敏感关键字

    private bool FilterIllegalChar(string sWord) { var result = false; var keyWord = @"select|inser ...

  7. 【JAVA基本数据类型包装类】

    一.概述 JAVA中一共有8种数据类型,分别是byte short int long boolean float double  char,与此相对应的,有8个类与它们分别对应: byte Byte ...

  8. 【POJ水题完成表】

    题目 完成情况 poj1000:A+B problem 完成 poj1002:电话上按键对应着数字.现在给n个电话,求排序.相同的归一类 完成 poj1003:求最小的n让1+1/2+1/3+...+ ...

  9. 【ubuntu 】常见错误--Could not get lock /var/lib/dpkg/lock

    ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错: E: Could not ...

  10. PHP类方法重写原则

    可能我们日常工作中很少用到这块知识点,但我还是喜欢把遇到的却不清楚的知识点摸清 PHP的类方法重写规则 1.final修饰的类方法不可被子类重写 final修饰的类方法不可被子类重写 即便final ...