iOS之OC集合遍历和数组排序 - 大白社区
- 发帖时间:
- 2016-05-25 09:20:54
摘要:iOS之OC集合遍历和数组排序,这里包括各种排序,排序的方法,很适合初学者使用
iOSDay16之OC集合遍历和数组排序
1、集合遍历
1> 遍历
集合(Collection):OC中提供的容器类:数组,字典,集合。
遍历:对集合中元素依次取出的过称叫做遍历。
三种方式:① for循环遍历; ② NSEnumerator遍历; ③ for...in遍历
2> for循环遍历
① 数组遍历
原理:通过for循环的循环变量用作数组元素下标来获取不同下标的元素。
循环次数就是数组元素的个数。
// 数组 for (int i = 0; i < arr.count; i++) { NSLog(@"%@", arr[i]); }
② 字典遍历
原理:先获取字典中所有的key,存储到数组中,遍历数组依次取出每一个key,然后根据key从字典中取出对应的value
循环次数就是字典元素的个数。
// 字典 // 获取字典中所有的key值 NSArray *allKey = [dict allKeys]; // 遍历key值数组,访问对应的object值 for (int i = 0; i < allKey.count; i++) { NSString *key = allKey[i]; NSLog(@"%@", [dict objectForKey:key]); }
③ 集合遍历
原理:用集合的allObjects属性先取到集合的所有元素存储到数组中,再通过for循环的循环变量用作下标来取到每个元素。// 集合 // 取出集合中的所有元素放到数组中 NSArray *setArray = [set allObjects]; for (int i = 0; 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];
}
- (NSComparisonResult)compareByName:(Person *)anotherPerson;
// 比较方法的实现
- (NSComparisonResult)compareByName:(Person *)anotherPerson {
return [self.name compare: anotherPerson.name];
}