美文网首页程序员
集合,数组,字典的快速遍历和排序

集合,数组,字典的快速遍历和排序

作者: 每日总结 | 来源:发表于2016-02-29 23:28 被阅读429次

遍历

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对象组成的可变数组;

相关文章

网友评论

    本文标题:集合,数组,字典的快速遍历和排序

    本文链接:https://www.haomeiwen.com/subject/ydvgkttx.html