博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSArray数组(2)
阅读量:2352 次
发布时间:2019-05-10

本文共 4775 字,大约阅读时间需要 15 分钟。

 //数组最重要的功能:打包数据,方便参数传递

 》1:使用for循环遍历数组

 NSArray *array = @[@"one",@"two",@"three"];

 for(int i = 0; i<array.count;i++){

  NSString *str = array[i];

  NSLog(@"array[%d] = %@",i,str);

}    //array[0] = one    array[1] = two   array[2] = three

》2:oc 比c增加的数据类型:BOOL id  NSObject *(OC中所有的对象类型,如NSString ,NSArray)   block   SEL

          还增加了流程控制语句:增强for循环   for(NSObject *obj in array)

//使用增强for循环的方式遍历数组

//array.count 值是多少,他就会循环多少次,每一次都取出数据中的一个元素存储到str中

  for(NSString*str in array)

{

   NSLog(@"str = %@",str);    //str = one  str  =two  str = three

  

》3:注意事项:如果你的数组中存储了多种类型的数据,那么最好不要调用某个对象特有的方法,会导致程序崩溃。

  在实际开发中,一个数组往往只负责存储一种数据类型

Person *p1 = [[Person alloc]init];

NSArray *array  = @[@"one",[NSNumber numberWithInt:10,p1];

for(NSString *str in array

{

   NSLog(@"array str %@",str);

 // NSLog(@"str %ld,str.length); //这个是错误的,会报 unrecognized selector sent to instance 错误,找不到方法

}

》4:枚举器遍历数组

NSArray *array = @[@"one",@"two",@"three"];

 NSEnumerator *enumerator = [array objectEnumerator]; //返回一个枚举器

 NSString *value;

 while(value = [enumerator  nextObject])  //获得当前的元素(如果存在nextObject 就返回一个当前的值,存储到value中)

{

   NSLog(@"enum str %@",value);   //enum str one   enum str two  enum str three

}

》5:数组排序

(1)使用sortedArrayUsingSelector ,也是最简单的排序方式

NSArray *array = @[@"b",@"d",@"a",@"z"];  //array 里面的顺序是不会改变的

array = [array sortedArrayUsingSelector:@selector(compare:)];  //返回的是一个全新的数组array

//也可以这样写NSArray  *array1= [array sortedArrayUsingSelector:@selector(compare:)];

NSLog(@"排序后 %@",array);  //结果为   排序后(a,b,d,z)

(2)使用block方式排序

NSArray *array = @[@"z",@"4",@"b",@"3",@"x"];

array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){

    NSComparisonResult result = [obj1 compare:obj2];

     return result;

  //也可以直接这样写: return [obj1 compare:obj2];    //正序排序  (3,4,b,x,z)

  return [obj2 compare:obj1];  //倒序排序(z,x,b,4,3)

} ];

(3)给自定义对象进行排序,用NSSortDescriptor进行

 创建Person ,继承自NSObject

 在Person.h中

@property (nonatomic,strong) NSString *name;

@property(nonatomic,assign)int age;

@property(nonatomic,strong)NSString *year;

-(id)initWithName:(NSString *)name andAge:(int)age andYear:(NSString *)year;

在Person.m中

-(id)initWithName:(NSString *)name andAge:(int)age andYear:(NSString *)year{

   for(self = [super init]

  {

     _name= name;

    _age = age;

    _year = year;

   }

}

+(NSString *)description

{

    return  [NSString stringWithFormat:@"name %@ ,age %d, year %@",_name,_age,_year];

}

 

 在main.m中调用

Person *p1 = [[Person alloc]initWithName:@"zhong" andAge:22 andYear:@"1993"];

Person *p2 = [[Person alloc]initWithName:@"tang" andAge:19 andYear:@"1996"];

Person *p3 = [[Person alloc]initWithName:@"lii" andAge:34 andYear:@"1980"];

NSArray *array = @[p1,p2,p3];

//如果给自己定义的对象的排序,必须根据某个属性来排序。

//sortDescriptorWithKey  参数要的就是你对象中,要依据哪个属性来排序,就把那个属性的名字当成key传入

//ascending   YES表示正序, NO表示倒序

NSSortDescriptor *d1 = [NSSortDescriptor sortDescriptorWithKey:@"age"  ascending:YES];

 //NSSortDescriptor *d2 = [NSSortDescriptor sortDescriptorWithKey:@"year"  ascending:YES];

//如果你要使用多个属性来进行排序,默认在前面的NSSortDescriptor优先级比较高

 NSArray *descripts = @[d1];

//NSArray *descripts = @[d1,d2];

array = [array sortedArrayUsingDescriptors:descripts];

NSLog(@"排序后 %@",array);

 (4)给自定义对象进行排序,用sortedArrayUsingComparator进行

NSArray *array1 = @[p1,p2,p3];

array1 = [array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){

Person *p1 = obj1;

Person *p2= obj2;

//year

return  [p1.year compare:p2.year];

}];

》6:可变数组,改变的都是原来的数组

NSMutableArray 继承自NSArray

(1)创建可变数组

NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:0];

//使用addObject动态给数组增加元素,数组中可以存储同一个对象多次

 [array addObject:@"one"];

[array addObject:@"two"];

[array addObject:@"three"];

 [array addObject:@"one"];

NSLog(@"%@",array); //(one,two,three,one)

 (2)指定对象插入的位置

NSString *str1 = @"one"'

[array insertObject:str1 atIndex:2] ; 

(3)删除  会通过对象,删除数组中所有的同一地址的对象

[array removeObject:str1];

(4)通过索引的方式删除对象,超出了数组的count值,那就会导致异常  index beyond bounds

[array removeObjectAtIndex:0];

(5)删除数组中所有的元素

[array removeAllObjects];

 

 (6)for 遍历数组

 for(int i = 0;i<array.count;i++)

{

    NSString *str = [array objectAtIndex:i];

    //[array  removeObject:str1];   在遍历数组的时候,千万不要给数组中增加或者删除元素

  NSLog(@" %@",str);

}

 (7)增强for循环 遍历

for(NSString *str in array)

{

    // [array removeObject:str1];  如果在增强for循环 中删除元素,会直接导致异常出现

    NSLog(@" %@",str);

}

 

(8)枚举器

NSEnumerator  *enumerator = [array objectEnumerator];

NSString *value;

while(value = [enumerator nextObject]){

// [array removeObject:str1];  如果在枚举器 中删除元素,会直接导致异常出现

    NSLog(@" %@",str);

}

(9)要通过遍历的方式确定删除某个元素

NSMutableArray *array = [[NSMutableArray alloc]init];

[array addObject:@"one"];

[array addObject:@"two"];

[array addObject:@"three"];

[array addObject:@"one"];

 NSMutableArray *tmp = [[NSMutableArray alloc]init];
for (NSString *str in array)
{
   if([str isEqualToString:@"two"])
   {
      [tmp addObject:str];
    }
//遍历临时数组
  for(int i = 0;i<tmp.count;i++)
 {
     NSString *str = [tem objectAtIndex:i];
    [array removeObject:str];  //从原数组中删除 临时数组中存储的对象
}

    

转载地址:http://mxrvb.baihongyu.com/

你可能感兴趣的文章
深入理解 WIN32 PE 文件格式
查看>>
win7用户帐户控制数据重定向
查看>>
win7及以上系统检测目标进程对文件和文件夹的访问权限
查看>>
cmake工具简介
查看>>
Visual Studio原生开发的20个调试技巧(上)
查看>>
Visual Studio原生开发的20个调试技巧(下)
查看>>
windows多线程,debug时设置线程名称
查看>>
新环境配置编译chromium
查看>>
一个定制CFileDialog对话框的实例
查看>>
再谈 CFileDialog 对话框的定制
查看>>
在打开文件对话框上实现图象预览
查看>>
子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明
查看>>
C++构造函数初始化列表与构造函数中的赋值的区别
查看>>
系统负载能力浅析
查看>>
为Source Insight添加makefile、kconfig、*.S文件支持
查看>>
使用Windbg寻找高CPU占用线程
查看>>
正则表达式的语法规则
查看>>
正则表达式规则以及贪婪匹配与非贪婪匹配
查看>>
C++ typename的起源与用法
查看>>
长度单位换算表
查看>>