ios ——OC——NSArray的用法
NSArray
从本质上讲,NSArray 就是一个存放对象的容器。
NSArray只能存储Objective-C 对象,而不能存储C语言中的基本数据类型,比如:int,flot,指针等。 在使用NSArray时,需特别注意,必须以nil 结尾。以此来代表结束。
NSArray 创建的是静态数组,一旦创建之后,就再也不能添加和删除数组中的对象了。
1.NSArray的创建:
类方法创建数组:
- NSArray *array1 = [NSArray arrayWithObject:@"obj"];
- NSArray *array2 = [NSArray arrayWithObjects:@"obj1", @"obj2", @"obj3", nil];
- NSArray *array3 = [NSArray arrayWithArray:array2];
实例方法创建数组:
NSArray *array4 = [[NSArray alloc] initWithObjects:@"AAA", @"bbb", nil];
NSArray *arr = [NSArray array];//初始化一个空的数组(不常用);
NSArray *arr1 = [NSArray arrayWithObject:@"123"];
NSLog(@"%@",arr1);//初始化一个包含一个元素的数组;
NSArray *arr2 = [NSArray arrayWithObjects:@"zhangyu",@"zhangdawei",@"liuhuan" ,nil];//初始化多个元素的数组,元素之间用逗号隔开,最后以nil结束;
NSArray *arr3 = @[@"123",
@"456",
@"789"
];//初始化多个元素时数组元素之间用逗号隔开,注意,最后一个元素后面不要加逗号(如果元素是一个类的对象则不用双引号)。
2.NSArray的使用:
(1)求数组的长度:
NSUInteger count = arr3.count;//数组元素的个数(数组的长度);
NSLog(@"数组元素的个数:%zi",count);
NSLog(@"数组元素的个数:%zi",arr3.count);
array == nil 和 [array count] == 0
前者为true的时候表示这个对象是nil,是一个空的指针,它甚至没有被创建出来。
后者为true表示这个对象为nil或者没有任何元素。
(2)取数组中的元素
[arr3 firstObject];//数组的第一个元素
[arr3 lastObject];//数组的最后一个元素
[arr3 objectAtIndex:2];//指定位置上的数组元素
long int i = [arr3 indexOfObject:@"123"];//获取某个元素在数组中的位置(数据类型为long/long int/NSUInteger(Integer 整数 整体 完整的事物));
[arr3 lastObject];//数组的最后一个元素
[arr3 objectAtIndex:2];//指定位置上的数组元素
long int i = [arr3 indexOfObject:@"123"];//获取某个元素在数组中的位置(数据类型为long/long int/NSUInteger(Integer 整数 整体 完整的事物));
NSLog(@"i=%ld",i);
(3)判断数组中是否包含某个元素
BOOL flag = [arr3 containsObject:@"123"];//判断数组中是否包含某个元素 (1包含, 0不包含)
NSLog(@"flag=%d",flag);
(4)数组的遍历 (很重要)
<1>for循环遍历(最常用)
for(int i = 0;i < arr3.count;i++)
{
NSString *str = arr3[i];
NSLog(@"%@",str);
//id obj = [arr3 objectAtIndex:i];
//NSLog(@"%@",obj);
{
NSString *str = arr3[i];
NSLog(@"%@",str);
//id obj = [arr3 objectAtIndex:i];
//NSLog(@"%@",obj);
}
<2>使用枚举器进行遍历
NSEnumerator *e = [arr3 objectEnumerator];//获取数组所有元素的枚举器
//[e nextObject]第一次遍历,nextobject指向数组的首元素,当取值结束以后,再指向下一个元素,直到取完最后一个元素,此时nextObject指向nil,值为0,遍历结束
id obj;
while(obj=[e nextObject])
//[e nextObject]第一次遍历,nextobject指向数组的首元素,当取值结束以后,再指向下一个元素,直到取完最后一个元素,此时nextObject指向nil,值为0,遍历结束
id obj;
while(obj=[e nextObject])
NSLog(@"%@",obj);
<3>快速枚举(最快速,但没办法使用下标)(不需要 NSEnumerator *e = [arr3 objectEnumerator];直接用for进行遍历)
for(id obj1 in arr3)
NSLog(@"%@",obj1);
<4>数组存放自定义类的对象(定义一个student类和name,number属性 ,初始化5个对象)
Student *stu1 = [[Student alloc]init];
stu1.name = @"张一";
stu1.number = 201501;
Student *stu2 = [[Student alloc]init];
stu2.name = @"张二";
stu2.number = 201502;
Student *stu3 = [[Student alloc]init];
stu3.name = @"张三";
stu3.number = 201503;
Student *stu4 = [[Student alloc]init];
stu4.name = @"张四";
stu4.number = 201504;
Student *stu5 = [[Student alloc]init];
stu5.name = @"张五";
stu5.number = 201505;
NSArray *studentarr2 =@[stu1,
stu2,
stu3,
stu4,
stu5
];
for (int i = 0; i < studentarr2.count; i++) {
stu1.name = @"张一";
stu1.number = 201501;
Student *stu2 = [[Student alloc]init];
stu2.name = @"张二";
stu2.number = 201502;
Student *stu3 = [[Student alloc]init];
stu3.name = @"张三";
stu3.number = 201503;
Student *stu4 = [[Student alloc]init];
stu4.name = @"张四";
stu4.number = 201504;
Student *stu5 = [[Student alloc]init];
stu5.name = @"张五";
stu5.number = 201505;
NSArray *studentarr2 =@[stu1,
stu2,
stu3,
stu4,
stu5
];
for (int i = 0; i < studentarr2.count; i++) {
id stu = studentarr2[i];
//判断某个对象是否是某个类,多用于处理类型不确定的情况
if ([stu isKindOfClass:[Student class]]) {
NSLog(@"姓名:%@ 学号:%d",[stu name],[stu number]);
}
if ([stu isKindOfClass:[Student class]]) {
NSLog(@"姓名:%@ 学号:%d",[stu name],[stu number]);
}
}
运行的结果:
姓名:张一 学号:201501
姓名:张二 学号:201502
姓名:张三 学号:201503
姓名:张四 学号:201504
姓名:张二 学号:201502
姓名:张三 学号:201503
姓名:张四 学号:201504
姓名:张五 学号:201505
(5)排序(从小到大)
NSArray *arr4 = @[@"6",@"9",@"8",@"1"];
NSArray *arr5 = [arr4 sortedArrayUsingSelector:@selector(compare:)];(用于数组中的元素不是对象(是字符串的情况!))
NSLog(@"%@",arr5);
加入先创建一个Student类,初始化四个对象stu1,stu2,stu3,stu4放入数组,按要求进行排序
排序方法定义:
-(NSComparisonResult)compareWithScore:(Student *)stu;
排序方法实现:
-(NSComparisonResult)compareWithScore:(Student *)stu
{
NSComparisonResult result;
if(self.score < stu.score)
result = 1;
else result = -1;
return result;
{
NSComparisonResult result;
if(self.score < stu.score)
result = 1;
else result = -1;
return result;
}
主程序:
NSArray *studentarr = @[ stu1,
stu2,
stu3,
stu3,
stu4
//数组元素是某个类的对象的排序 ];
//第一种方法:
NSArray *scorearr1 = [studentarr sortedArrayUsingSelector:@selector(compareWithScore:)];
NSLog(@"scorearr1=%@",scorearr1);
//第二种方法:
NSArray *scorearr2 = [studentarr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSComparisonResult result = -1;
if ([obj1 score] < [obj2 score])
result = 1;
return result;
}];
NSLog(@"scorearr2=%@",scorearr2);
//第三种方法(描述方法):
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO ];
NSArray *desarr = @[sort];
NSArray *scorearr3 = [studentarr sortedArrayUsingDescriptors:desarr];
NSArray *scorearr1 = [studentarr sortedArrayUsingSelector:@selector(compareWithScore:)];
NSLog(@"scorearr1=%@",scorearr1);
//第二种方法:
NSArray *scorearr2 = [studentarr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSComparisonResult result = -1;
if ([obj1 score] < [obj2 score])
result = 1;
return result;
}];
NSLog(@"scorearr2=%@",scorearr2);
//第三种方法(描述方法):
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO ];
NSArray *desarr = @[sort];
NSArray *scorearr3 = [studentarr sortedArrayUsingDescriptors:desarr];
NSLog(@"scorearr3=%@",scorearr3);
// 根据学生的成绩由低到高排序,如果成绩一样,则按照年龄从小到大排序*(描述方法)
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES ];
NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES ];
NSArray *desarr1 = @[sort1,sort2];
NSArray *scoreagearr = [studentarr sortedArrayUsingDescriptors:desarr1];
NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES ];
NSArray *desarr1 = @[sort1,sort2];
NSArray *scoreagearr = [studentarr sortedArrayUsingDescriptors:desarr1];
NSLog(@"scoreagearr=%@",scoreagearr);
感谢您的访问!
若对您有帮助或有兴趣请关注博客:http://www.cnblogs.com/Rong-Shengcom/