ios ——OC——NSArray的用法

NSArray
 
 
从本质上讲,NSArray 就是一个存放对象的容器。
NSArray只能存储Objective-C 对象,而不能存储C语言中的基本数据类型,比如:int,flot,指针等。 在使用NSArray时,需特别注意,必须以nil 结尾。以此来代表结束。
NSArray 创建的是静态数组,一旦创建之后,就再也不能添加和删除数组中的对象了。
 
 
1.NSArray的创建:
类方法创建数组:
  1. NSArray *array1 = [NSArray arrayWithObject:@"obj"];  
  2. NSArray *array2 = [NSArray arrayWithObjects:@"obj1", @"obj2", @"obj3", nil];  
  3. 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 整数 整体 完整的事物));
        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);
        }
<2>使用枚举器进行遍历
        NSEnumerator *e = [arr3 objectEnumerator];//获取数组所有元素的枚举器
        //[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++) {
            id stu = studentarr2[i];
            //判断某个对象是否是某个类,多用于处理类型不确定的情况
            if ([stu isKindOfClass:[Student class]]) {
                NSLog(@"姓名:%@ 学号:%d",[stu name],[stu number]);
                          }
                 }
运行的结果:
姓名:张一 学号:201501
姓名:张二 学号: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;
}
主程序:
 NSArray *studentarr = @[    stu1,
                             stu2,
                             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];
        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];
        NSLog(@"scoreagearr=%@",scoreagearr);
 
posted @ 2015-04-06 18:39  #零下一度&  阅读(632)  评论(0编辑  收藏  举报