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

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

作者: 每日总结 | 来源:发表于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