遍历
for 循环遍历
原理:通过for循环的循环变量用作数组元素下标来获取不同下标的元素
循环次数就是数组元素的个数
数组
NSArray *arr1 = @[@1,@2,@3,@4,@5];
NSMutableArray *arr2 = [@[] mutableCopy];
for (NSInteger i = arr1.count - 1 ; i >= 0; i--) {
[arr2 addObject:arr1[i]];
}//倒序遍历,虽然count属性的返回值是NSUInteger类型,但这个值恒大于0,会导致出错
//通过遍历将arr1中的元素加到arr2中,当然还有很多更有用的作用;
字典
字典的遍历是通过循环键值,然后通过键获取对象值;
NSDictionary *dic1 = @{@"name":@"zhangsan",
@"age":@20,
@"gender":@"man"};
NSArray *keys = [dic1 allKeys];
for (int i = 0; i < keys.count; i++) {
NSLog(@"%@",[dic1 objectForKey:keys[i]]);
}
集合
集合遍历是将集合中的元素用allObjects属性先取到集合的所有元素存储到数组中,再通过数组的遍历来取到每个元素;
NSSet *set1 = [NSSet setWithObjects:@1,@2,@3,@4,nil];
NSArray *arr3 = [set1 allObjects];
for (int i = 0; i < set1.count; i++) {
NSLog(@"%@",arr3[i]);
}
NSEnume�rator枚举器遍历
NSEnumerator 没有用来创建实例的借口,只能依附于集合类(NSArray,NSSet,NSDictionary);
NSEnumerator 实际上是建立了一个链表,使用nextObject来遍历访问元素;
数组
NSEnumerator *enume1 = [arr objectEnumerator];
//正序枚举器对象;
NSEnumerator *enume2 = [arr reverseObjectEnumerator];
//倒序枚举器对象;
id value = nil;
while ((value = enume.nextObject)) {
NSLog(@"%@",value);
}
字典
NSDictionary *dic = @{@"name":@"zhangsan",@"gender":@"nv"};
NSEnumerator *enu1 = [dic keyEnumerator];
id value = nil;
while ((value = enu1.nextObject)) {
NSLog(@"%@",value);
NSLog(@"%@",[dic objectEnumerator]);
}
集合
NSSet *set1 = [NSSet setWithObjects:@1,@2,@3,@4,nil];
NSEnumerator *enu = [set1 objectEnumerator];
id value = nil;
while ((value = enu.nextObject)) {
NSLog(@"%@",value);
};
字典和集合都是无序的,所以没有正序倒序;
for...in快速枚举
比较常用的遍历方法
是在NSEnumerator的基础上封装的更加方便快速的遍历集合元素的方式;
数组
NSArray *cityArr = @[@"beijing",@"shanghai",@23];
for (id str in cityArr) {
NSLog(@"%@",[str class]);
//class判断对象是个什么类
if ([str isKindOfClass:[NSString class]]) {
NSLog(@"%@",str);
//只输出NSString这个类的对象;
}
}
字典
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"m",@"age":@"22"};
for (id key in dic) {
if ([key isEqualToString:@"name"]) {
NSLog(@"%@",[dic objectForKey:key]);
}//只输出名字;
}
集合
NSSet *set = [NSSet setWithObjects:@2,@4,@3,@1,nil];
for (NSNumber *num in set) {
NSLog(@"%@",num);
}
排序
字典和集合都是无序的,所以没有排序方法,如果有需要,可以先转换成数组再进行排序;
NSSortDescriptor类
它可以把元素的某个属性作为key进行升序或降序的排序,每个NSSortDescriptor对象就是一个排序条件
NSArray *arr = @[@"aaa",@"bbb",@"ccc"];
NSSortDescriptor *sortD = [NSSortDescriptor sortWithKey:@"self" ascending:NO];
//Key:后面用@""写排序依据,如果元素本身就可以用来作排序依据,可以写@"self"或者nil;
//如果数组里的元素是对象,排序的时候可以用对象的属性来作排序依据;如按照Person类的name进行排序,使用@"name"作为参数
//ascending:后面写是否升序;
NSArray *ar = [arr sortedArrayUsingDescriptors:@[sortD]];
//Descriptor:后面是一个数组,可以有好几个排序依据,即使只有一个也要写成数组形式;
NSLog(@"%@",ar);
可变数组对自身进行修改的排序方法为:
NSMutableArray *mArr = [@[]mutableCopy];
[mArr sortUsingDescriptors:@[]];
sortUsingSelector方法
此方法需要自行在类中定义返回值是NSCompari�onResult的排序方法;
NSComparionResult是一个枚举类型,有三个值,升序是-1,相等是0,倒序是1;
当返回值是1时发生交换,即NSComparionResult默认是升序
compare方法刚好和NSComparionResult相和;
这里给出一个例子,仅给出实现函数
假设一个Person类,有name,gender,age三个属性;
以name为例
升序时
-(NSComparisonResult)compareByNameAsc:(Person *)otherPerson{
return [_name compare:otherPerson.name];
}
降序时
-(NSComparisonResult)compareByNameDes:(Person *)otherPerson{
if ([_name compare:otherPerson.name] == 1) {
return NSOrderedAscending;
}else if ([_name compare:otherPerson.name] == 0) {
return NSOrderedSame;
}else {
return NSOrderedDescending;
}
}
使用时
[pArr sortUsingSelector:@selector(compareByNameAsc:)];
//pArr是一个Person对象组成的可变数组;
网友评论