一、集合遍历
1、集合:OC中提供的容器类,数组,字典,集合。
2、遍历:对集合中元素依次取出的过程叫做遍历。
二、for循环遍历
1、通过for循环的循环变量用作数组元素下标来获取不同下标的元素,循环次数就是数组元素的个数。
2、
// for 循环遍历数组 ; i < array.count; i++) { // 根据数组下标访问数组元素 NSString *str = [array objectAtIndex:i]; NSString *str1 = array[i]; // 两种访问方式 NSLog(@"%@", str1); } // for循环遍历字典 // 获取字典中所有的key值 NSArray *arr = [dict allKeys]; // 遍历keys数组,访问对应的object值 ; i < arr.count; i++) { // 通过下标获取每个key值 id obj = [dict objectForKey:arr[i]]; id obj = dict[arr[i]]; // 两种获取方式 NSLog(@"%@", obj); } // for循环遍历集合 // 取出集合中的元素存放在数组中 NSArray *setArray = [set allObjects]; ; i < setArray.count; i++) { // 两种存放方式 NSLog(@"%@", setArray[i]); NSLog(@"%@", [setArray objectAtIndex:i]); }
// 定义一个数组, 包含5个字符串对象, 倒序取出数组中所有元素, 并存储到另一可变数组中。 NSArray *array3 = [NSArray arrayWithObjects:@"zhangsan", @"lisi", @"wangwu", @"asd", @"wqe", nil]; NSMutableArray *marray = [NSMutableArray array]; NSLog(@"%@", array3); ; i >= ; i--) { // [marray addObject:array3[i]]; marray = [array3 objectAtIndex:i]; NSLog(@"%@", marray); }
三、NSEnumerator
1、枚举器,遍历集合中的元素,依附于集合类,没有用来创建实例的接口,NSEnumerato的nextObject方法可以遍历每个集合元素,结束返回nil,通过与while结合使用可遍历集合中所有元素。对可变集合进行枚举操作时,不能通过添加或删除对象这类方式来改变集合容器的元素个数。
for循环可以修改集合的内容。
2、
// 遍历数组(正序) // 正序的枚举器对象 NSArray *array1 = @[@"aCat", @"aDog", @"aFu", @"aMeng"]; NSEnumerator *arrayEnum = [array1 objectEnumerator]; id value = nil; // 存储数组中的元素对象 // 循环次数未知,所以判断value不为空就打印数据,如果value为空循环停止 while ((value = [arrayEnum nextObject])) { NSLog(@"%@", value); } // 遍历数组(反序) // 倒序的枚举器对象 NSEnumerator *arrayEnum1 = [array1 reverseObjectEnumerator]; id value1 = nil;// 存储数组中的元素对象 while ((value1 = [arrayEnum1 nextObject])) { NSLog(@"%@", value1); } // 遍历字典 // 遍历到的是字典中的object值 // 字典中存放的数据是无序的,没有反向枚举 NSEnumerator *dictionaryEnum = [dict1 objectEnumerator]; id value2 = nil; while ((value2 = [dictionaryEnum nextObject])) { NSLog(@"%@", value2); } // 遍历集合 // 遍历到集合的每一个元素 // 集合中村粗的数据是无序的,没有反向枚举的概念 NSEnumerator *setEnum = [set1 objectEnumerator]; id value3 = nil; while ((value3 = [setEnum nextObject])) { NSLog(@"%@", value3); }
四、for...in
1、快速枚举,是在NSEnumerator的基础上封装的更加方便的快速的遍历几何元素的方式
2、
// for...in遍历数组 NSArray *array =@[@"aMeng", @"aSha", @"aBen"]; NSDictionary *dict2 = @{ @"name" : @"aGen", ", @"sex" : @"男", @"hobby": @"nana" }; NSSet *set2 = [NSSet setWithObjects:@"nana", @"zhouyuqi", @"shuaige", @"mengboy", @"王海", @"刘傲然", @"小强", nil]; for (NSString *string in array) { NSLog(@"%@", string); } // for...in遍历字典(得到的是key) for (NSString *key in dict2) { // 通过key访问 // NSLog(@"%@", dict2[key]); NSLog(@"%@",[dict2 objectForKey:key]); } // for...in遍历集合(得到的是集合的元素对象) for (NSString *setString in set2) { NSLog(@"%@", setString); }
// 定义一个数组, 包含5个字符串对象, 取出数组中所有字符串, 并拼接生成一个新的字符串。 NSMutableArray *marrays = [NSMutableArray arrayWithObjects:@"abc", @"def", @"hig", @"klm" ,@"nop", nil]; NSMutableString *strings1 = [NSMutableString string]; for (NSString *value in marrays) { NSLog(@"%@", value); [strings1 appendString:value]; } NSLog(@"%@", strings1);
// 使用 for...in... 完成:定义一个字典, 用于存储一个人的name, sex, age三个数据, for...in...遍历, 输出此人的name到控制台 NSMutableDictionary *dics = [NSMutableDictionary dictionaryWithObjectsAndKeys:", @"age", nil]; for (id value in dics) { if ([value isEqualToString:@"name"]) { NSLog(@"%@", [dics objectForKey:value]); } }
五、数组排序
1、数组是有序容器,因此集合中只有数组才能排序。
2、
// 1.使用NSSrotDescriptor (排序描述符,相当于排序条件) // 给排序的数组生成排序描述符 // 排序描述符由两个参数组成 // key(键):对于一个给定的集合,对应值的键位将对集合中的每个元素进行排序 // ascending:升序(YES),降序(NO)。 NSSortDescriptor *arraySortDes =[[NSSortDescriptor alloc]initWithKey:@"self" ascending:YES]; // 不可变的数组排序 [array sortedArrayUsingDescriptors:@[arraySortDes]]; for (NSString *obj in array) { NSLog(@"%@", obj); } // 可变数组排序 [mArray sortUsingDescriptors:@[arraySortDes]]; for (NSString *str in mArray) { NSLog(@"%@", str); } // 数组中存放自定义对象进行排序 NSSortDescriptor *arrayByNameSortDes = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; personArray = [personArray sortedArrayUsingDescriptors:@[arrayByNameSortDes]]; for (id obj in personArray) { NSLog(@"%@", obj); } NSSortDescriptor *arrayByNameSortDes = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO]; personArray = [personArray sortedArrayUsingDescriptors:@[arrayByNameSortDes]]; for (id obj in personArray) { NSLog(@"%@", obj); } // 将personMarry按照姓名降序排列 NSSortDescriptor *mSortDes = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; [personMarray sortUsingDescriptors:@[mSortDes]]; NSLog(@"%@", personMarray); //2.数组排序,使用数组中两个元素比较的方法名排序 // 不可变数组 SEL sel = @selector(compare:); array = [array sortedArrayUsingSelector:sel]; NSLog(@"%@", array); // 可变的数组 [mArray sortUsingSelector:@selector(compare:)]; NSLog(@"%@", mArray); // 数组元素是自定义类型的对象 // 不可变数组排序 // 方法是自己定义的 // 按照姓名比较 personArray = [personArray sortedArrayUsingSelector:@selector(compareByName:)]; NSLog(@"%@", personArray); personArray = [personArray sortedArrayUsingSelector:@selector(compareByAge:)]; NSLog(@"%@", personArray); [personMarray sortUsingSelector:@selector(compareByName:)]; NSLog(@"%@", personMarray); [personMarray sortUsingSelector:@selector(compareByAge:)]; NSLog(@"%@", personMarray);