黑马软件工程师——Foundation框架常用类(NSArray/NSMutableArray)
黑马程序员——Foundation框架常用类(NSArray/NSMutableArray)
2. 数组的基本使用
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
简介
本文简单介绍了Foundation框架中常用的一些类的基本用法,分别简单介绍数组(NSArray/NSMutableArray)、集合(NSSet/NSMutableSet)、字典(NSDictionary/NSMutableDictionary)、数字(NSNumber/NSValue)、日期(NSDate)、数据(NSData/NSMutableData)。介绍了这些类的常用方法。
注意:这些类只能存放OC对象,如果想保存一些基本的C数据(例如,int, float, double, BOOL等),则需要将这些基本的C数据封装成NSNumber类型的对象保存到这些类中,NSNumber对象是OC对象,可以被保存在这些类中。
NSArray/NSMutableArray
NSArray:是OC中静态的数组(不可变数组),只能存放OC对象(不能存放非OC对象,如int等类型数据),数组的最后一个元素一定是nil,表示结束。
NSMutableArray:是OC中动态数组(可变数组),其继承与NSArray,可以随时改变里面存放的元素。
1. 数组的创建
<pre name="code" class="objc" style="text-align: left;"><div style="text-align: left;"><pre name="code" class="objc"><pre name="code" class="objc"><pre name="code" class="objc">//第一种创建方式 NSArray *a1 = @[@"One"]; //第二种创建方式(initWithObjects) NSArray *a2 = [[NSArray alloc]initWithObjects:@"Tow", nil]; NSMutableArray *ma2 = [[NSMutableArray alloc]initWithObjects:@"Tow", nil];
//第三种创建方式(arrayWithObject(s)) NSArray *a3 = [NSArray arrayWithObject:@"Three"]; NSMutableArray *ma3 = [NSMutableArray arrayWithObject:@"Three"];
//第四种创建方式(arrayWithArray) NSArray *a4 = [NSArray arrayWithArray:a1]; NSMutableArray *ma4 = [NSMutableArray arrayWithArray:a1]; //第五种创建方式(读取文件,文件格式为XML) NSArray *a5 = [NSArray arrayWithContentsOfFile:@"/Users/Mac/Desktop/IOS_study/a.xml"]; NSMutableArray *ma5 = [NSMutableArray arrayWithContentsOfFile:@"/Users/Mac/Desktop/IOS_study/a.xml"]; //第六种创建方式(copy(产生不可变数组)、mutableCopy(产生可变数组)) NSString *a6 = [ma2 copy]; NSString *ma6 = [a2 mutableCopy];
2. 数组的基本使用
由于NSMutableArray是NSArray的子类,那我只演示NSArray,NSMutableArray也和NSArray一致。
//创建一个数组 NSArray *array = [[NSArray alloc]initWithObjects:@"One",@"Tow",@"Three", nil]; //按照索引值取出元素 id noe = [array objectAtIndex:0];//去除第一个元素 //获取数组中的个数 NSUInteger count = [array count];//count = 3; //判断数组中是否包含某个对象 BOOL isContenTow = [array containsObject:@"Tow"];//是否包含Tow这个对象 //返回一个对象在数组中的下标,找不到返回-1(NSNotFund) NSUInteger threeIndex = [array indexOfObject:@"Three"];//查找Three在数组中的下标,threeIndex = 2; //如果数组中存放的是字符串,可以将数组中的字符串连接成NSString NSString *str = [array componentsJoinedByString:@"-"];//"-"为连接符,将数组中的元素连接成一个字符串。 //访问最后一个元素 id last = [array lastObject]; //在原数组后面添加一个对象,形成一个新的数组 NSArray *array1 = [array arrayByAddingObject:@"Four"]; //将一个字符串,通过特定的字符分割成数组 NSString *str1 = @"This is separator"; NSArray *array2 = [str1 componentsSeparatedByString:@" "]; //使用NSRange截取数组 NSRange range = {1,2}; NSArray *array3 = [array subarrayWithRange:range]; /********NSMutableArray特有(NSArray没有的)*********/ //创建NSMutableArray NSMutableArray *mutablearray = [array mutableCopy]; //忘NSMutableArray中添加元素 [mutablearray addObject:@"Five"]; //删除NSMutableArray中的元素 [mutablearray removeObject:@"One"];
3. 数组的高级使用
①常见素组的四种遍历方式:
<pre name="code" class="objc">NSArray *array = [NSArray arrayWithObjects:@1,@7,@3,@5, nil]; /*********以下演示NSArray的遍历方式*********/ //第一种:for 普通遍历方式 for(int i = 0;i < array.count; i++) { NSLog(@"array[%i] = %@",i,array[i]); } //第二种:for..in 快速遍历方式 for (id obj in array) { NSLog(@"array[%ld] = %@",[array indexOfObject:obj],obj); } //第三种:Block 枚举遍历方式 [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"array[%ld] = %@",idx,obj); }]; //第四种:NSEnumerator 迭代器遍历方式 NSEnumerator *enumerator = [array objectEnumerator]; id obj = nil; while (obj = [enumerator nextObject]) { NSLog(@"array[%ld] = %@",[array indexOfObject:obj],obj); }
②常见以下四种排序方式
<pre name="code" class="objc">//第一种:简单排序(主要用于:NSString、NSNumber,这两个类中有compare方法) NSArray *array1 = [NSArray arrayWithObjects:@1,@7,@3,@5, nil]; NSArray *sortArray1 = [array1 sortedArrayUsingSelector:@selector(compare:)]; //第二种:指定方法进行排序(按学生姓名排序) //compareStudent为:Student中的一个对象方法,自己实现的。 NSArray *studentArray2 = [NSArray arrayWithObjects:s1,s2,s3,s4, nil]; NSArray *sortStudent2 =[studentArray2 sortedArrayUsingSelector:@selector(compareStudent:)]; //第三种:利用Block进行排序(按学生学号排序) NSArray *studentArray3 =[NSArray arrayWithObjects:s1,s2,s3,s4, nil]; NSArray *sortStudent3 = [studentArray3 sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) { //调用字符串的compare方法 return [obj1.no compare:obj2.no]; }];
//第四种:利用NSSortDescriptor(描述器,排序属性必须是NSString)进行排序( 姓名-》学号 :当姓名相同,学号小的在前面) NSArray *studentArray4 =[NSArray arrayWithObjects:s1,s2,s3,s4, nil]; /*****建立NSSortDescriptor进行排序**************/ NSSortDescriptor *studentdescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; NSSortDescriptor *studentdescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"no" ascending:YES];
NSArray *array = [NSArray arrayWithObjects:studentdescriptor1,studentdescriptor2, nil];
NSArray *sortStudent4 = [studentArray4 sortedArrayUsingDescriptors:array];附加排序过程使用到Student类Student.m文件中的代码:
//实现便利构造器(创建学生使用到了本方法) + (Student *)studentWithNo:(NSString *)no andName:(NSString *)name { Student *stu = [[Student alloc]init]; stu.no = no; stu.name = name; return stu; } //实现排序方法(利用第二种排序使用到了本方法) - (NSComparisonResult)compareStudent:(Student *)student { return [self.name compare:student.name]; }
③常见以下数组与其他类的转换方式
NSArray *array = @[@"1",@"2",@"3"];//NSArray *array = @[@1,@2,@3]; //NSArray->NSString(NSArray中存放OC对象必须是NSString/NSNumber类型) NSString *string = [array componentsJoinedByString:@"-"]; //string = @"1-2-3"(利用“-“符号进行连接) //NSString->NSArray(字符串中,利用”-“符合对字符串进行拆分) NSArray *array1 = [string componentsSeparatedByString:@"-"]; //array1 = @[@"1",@"2",@"3"];
④实力应用
实例示范:
利用NSArray进行排序:创建5个学生,学生属性有(学号、姓名、年龄、分数),现在将创建的5和学生进行排序(分数->年龄->学号),分数排降序,分数一样,按年龄排升序,年龄一样,按学号排降序。(因为学生年龄和分数不是NSString类型),所以不能用NSSortDescriptor进行排序。学生类Student.h文件
#import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic,copy) NSString *no;//学号 @property (nonatomic,copy) NSString *name;//姓名 @property (nonatomic,copy) NSNumber *age;//年龄 @property (nonatomic,copy) NSNumber *score;//分数 //定义一个便利构造器 + (Student *) studentWithNo:(NSString *)no andName:(NSString *)name andAge:(NSNumber *)age andScore:(NSNumber *)score; //定义一个排序方法 - (NSComparisonResult) compareStudent:(Student *)student; @end
学生类Student.m文件
#import "Student.h" @implementation Student //实现便利构造器(创建学生使用到了本方法) +(Student *)studentWithNo:(NSString *)no andName:(NSString *)name andAge:(NSNumber *)age andScore:(NSNumber *)score { Student *stu = [[Student alloc]init]; stu.no = no; stu.name = name; stu.age = age; stu.score = score; return stu; } //实现学生排序:分数降序,其他升序(分数->年龄->学号) - (NSComparisonResult)compareStudent:(Student *)student { //比较两个学生的分数 NSComparisonResult result = [student.score compare:self.score]; //分数一样,比较两个学生的年龄 if (result == NSOrderedSame) { result = [self.age compare:student.age]; //学生年龄一样,比较学生学号 if (result == NSOrderedSame) { result = [self.no compare:student.no]; } } //最后将比较结果返回 return result; } //重写description方法,利用NSLog答应输出时候调用 -(NSString *)description { return [NSString stringWithFormat:@"\n学号:%@\n姓名:%@\n年龄:%@\n分数:%@",_no,_name,_age,_score]; } @end
主函数main.m文件
#import <Foundation/Foundation.h> #import"Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"***************NSArray欢迎您**************"); Student *s1 = [Student studentWithNo:@"0001" andName:@"Zhangsan" andAge:@22 andScore:@89]; Student *s2 = [Student studentWithNo:@"0002" andName:@"Rose" andAge:@22 andScore:@89]; Student *s3 = [Student studentWithNo:@"0003" andName:@"Lisi" andAge:@24 andScore:@92]; Student *s4 = [Student studentWithNo:@"0004" andName:@"Wangwu" andAge:@26 andScore:@89]; Student *s5 = [Student studentWithNo:@"0005" andName:@"Zhaoliu" andAge:@22 andScore:@97]; NSArray *students = [NSArray arrayWithObjects:s1,s2,s3,s4,s5, nil]; //对这五个学生进行排序,分数按降序,其他按升序拍(分数->年龄->学号) NSArray *sortStudents = [students sortedArrayUsingSelector:@selector(compareStudent:)]; for (id obj in sortStudents) { NSLog(@"%@",obj); } } return 0; }结果输出:
2015-05-03 22:12:37.772 09-NSArray等排序问题[2879:177300] ***************NSArray欢迎您************** 2015-05-03 22:12:37.773 09-NSArray等排序问题[2879:177300] 学号:0005 姓名:Zhaoliu 年龄:22 分数:97 2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 学号:0003 姓名:Lisi 年龄:24 分数:92 2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 学号:0001 姓名:Zhangsan 年龄:22 分数:89 2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 学号:0002 姓名:Rose 年龄:22 分数:89 2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 学号:0004 姓名:Wangwu 年龄:26 分数:89
注意:以上第3种排序采用比较函数的是NSString、NSNumber类型,非NSString、NSNumber类型的请自己写比较函数。(NSString、NSNumber内部都有compare:方法),第4种排序采用的比较函数只有NSString类型,非NSString类型的不能用这种排序。
参考文献
SuperHappy的博客园--博客(NSString)
JiangWei0910410003的****--博客(NSArray/NSMutableArray)