文章目录

  • 不可变数组
    • 创建
      • 取出数组中元素
    • 遍历数组
    • 排序
      • 对自定义的类进行排序
        • 方法选择器
        • 排序描述器
    • 其他方法
      • 数组第一个元素和最后一个元素
      • 数组元素拼接成字符串
      • 可变数组
        • 添加元素
        • 插入元素
        • 删除元素
        • 替换元素

OC数组是oc集合数据类型中的一种,是有序集合,其他的两个是oc字典和set,是无序集合。

不可变数组

创建

1.initWithObjects方法结尾有个nil,是添加元素结束的标志,不作为真实的元素出现,也不会影响数组中元素的个数。
注意:基本数据类型不可以直接放入到OC数组,这是OC数组和C语言数组的一个区别。
但是可以通过NSNumbe把基本数据类型转转换成OC对象。
NSNumber *number=@1.1;
OC数组可以嵌套使用,即数组元素也可以是数组。

NSArray *array=[[NSArray alloc] initWithObjects:@"one",@"two",@"three",nil];
NSLog(@"%@",array);

2.元素个数:array.count
简化方式创建数组:就不能写nil,因为程序会自动在转换成第一种方式,会自动在末尾添加nil。

array=@[@"1",@"2",@"3",@"4"];

3.arrayWithObjects类方法创建
NSNumber *number=@1.1;
//如果NSNumber *number=nil;那么下面的代码就不会添加number以后的元素。

array=[NSArray arrayWithObjects:@"one",number,array,nil];

建议同一个数组中,元素类型是一样的。

取出数组中元素

NSArray *subarray =[array objectAtIndex:2];
或NSArray *subarray =array[2];
//如果不知道元素具体类型可以用id 范型指针,可以指代任意类型的对象,代替,注意id 后没*号。
id  object =[array objectAtIndex:2];

遍历数组

1.for循环,如果关注索引值i,要使用它,就需要用此方法。

NSArray *array=@[@"1",@"2",@"3",@"4"];
for(NSInteger i=0;i<array.count;i++){
NSLog(@"object:%@",array[i]);
}

2.for in循环又叫快速枚举,循环中的每个元素会赋给object,如果不清楚具体类型,比如就把NSString 用id代替。如果不关注索引值,而只关注元素值,就可用此方法。

for(NSString *object in array){
NSLog(@"%@",object);
}

3.枚举器

NSEnumerator *enumerator=[array objectEnumerator];
id object=[enumerator nextObject];
while(object){NSLog(@"object:%@",object);object=[enumerator nextObject];
}

排序

sortedArrayUsingSelector是方法选择器,我们可以选择方法使用。

NSArray *array=@[@"5",@"3",@"4",@"1",@"2"];
NSArray *resultArray=[array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",resultArray);

结果是按升序排序的。1,2,3,4,5

字符串是提供了compare方法的,如果元素的类没有提供compare方法,程序就会崩溃。

对自定义的类进行排序

方法选择器

结果只能是升序

//Person.h
#import <Foundation/Foundation.h>
@interface Person:NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign) NSUInteger age;
+(instancetype)personWithName:(NSString *)name age:(NSUInteger)age;
-(NSComparisonResult)comparePerson:(Person*)person;//Person.m
+(instancetype)personWithName:(NSString *)name age:(NSUInteger)age{Person *person=[[self alloc]init];person.name=name;//注意不可以使用_name因为是在类方法中,类方法是能直接操作成员变量的。perosn.age=agereturn person;
}
-(NSComparisonResult)comparePerson:(Person*)person{
return [self.name compare:person.name];//因为字符串有compare方法,所以如果以name比较的话可以直接返回。
}
-(NSString *)description{return [NSString stringWithFormat:@"name=%@,age=%zd",_name,age];
}//想要再打印类的时候结果理想,必须重写description方法//main.m
Person *person1=[Person personWithName:@"xiaohong" age:2];
Person *person2=[Person personWithName:@"tom" age:14];
Person *person3=[Person personWithName:@"xiaohong" age:20];
Person *person4=[Person personWithName:@"chenglong" age:30];
Person *person5=[Person personWithName:@"tim" age:5];
NSArray *array=@[person1,person2,person3,person4,person5];
NSArray *resultArray=[array sortedArrayUsingSelector:@selector(comparePerson:)];
//选择器不能用compare方法,因为Person类没有compare方法,选择器找不到方法就会蹦
NSLog(@"%@",resultArray); 

自定义对象指定规则来排序,通过重写,排序方法的返回值一定要是NSComparisonResult类型,是一种枚举类型,升序,降序,相同,方法名称可以顺便取,但是后面必须有一个参数,因为比较肯定是两两进行比较的。

排序描述器

给数组提供排序的规则,key一定要是类存在的属性,ascending :YES升序,NO降序。非常灵活。

NSSortDescription *desc1=[NSSortDescriptor sortDescriptorWithKey:@“name” ascending:NO];
NSSortDescription *desc2=[NSSortDescriptor sortDescriptorWithKey:@“age” ascending:NO];
NSArray *resultArray=[array sortedArrayUsingDescriptors:@[desc1]];
//NSArray *resultArray=[array sortedArrayUsingDescriptors:@[desc1,desc2]];先按第一个条件名字排序,如果name相同,就按第二个条件age排
NSLog(@"%@",resultArray);

其他方法

数组第一个元素和最后一个元素

NSArray *array=@[@"1",@"2",@"3",@"4"];
NSLog(@"first object:%@",array.firstObject);
NSLog(@"last object:%@",array.lastObject);

数组元素拼接成字符串

NSString *string=@"I love you";
NSArray *array1=[string componentsSeparatedByString:@" "];//字符串分割成数组
NSLog(@"%@",array1);
NSString *string1=[array1 componentsJoinedByString:@"-"];//数组拼接
NSLog(@"%@",array1);

可变数组

内存空间可数据是可以修改的。

NSMutableArray *array=[NSMutableArray array];

添加元素

[array addObject:@1];
[array addObject@"one"];

插入元素

[array insertObject:@2 atIndex:1];//插入到2的位置,结果是对象2,在下标2的位置。

删除元素

[array removeObject:@2];//将数组中是2的元素,全部删掉
[array removeAllObjects];//删除所有元素,得到的结果是个空数组

替换元素

[array replaceObjectAtIndex:1 withObject:@22];//将下标1的元素替换成22

OC语言基础八:OC数组相关推荐

  1. go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)

    go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...

  2. [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等

    Extends Coc .EnhancedCc++/ .C-like c# 会在github上开源一个库,如果是私有库要交钱,自己o公司的项目不要勾 会把源代码提交上去 <span style= ...

  3. OC语言基础 - 01

    OC语言源自于C语言,但是在C语言的基础上增加了不少OC特有的东西.因此有C语言和面向对象语言基础的同学还是可以很快掌握OC语言的. 在OC语言中,使用#import来代替C语言中的#include. ...

  4. OC语言基础内容 类的定义 第一个OC

    OC基础day01 第一个OC程序 OC与C的基本区别 C语言的源文件 XXX.c OC语言的源文件 XXX.m 在C语言中 用printf打印信息 OC中用NSLog()打印信息 OC中的改变 OC ...

  5. OC语言基础一:OC方法调用机制,new方法实现原理

    文章目录 OC方法调用机制 new方法实现原理 野指针 内存溢出 内存泄漏 alloc和init OC方法调用机制 OC有两种方法 Person *person=[Person new]; [pers ...

  6. 关于OC语言基础的总结

    原文地址:http://www.kankanews.com/ICkengine/archives/24423.shtml 1.OC的动态性 oc的动态性让程序可以在运行时判断其该有的行为,而不是像c等 ...

  7. [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习

    一.类学习引入 //缺点 _result的结果一直在变化,得创建变量,在堆区一直申请空间 <span style="font-size:14px;">#import&l ...

  8. Java程序设计语言基础04:数组

    目录 1. 数组基础 1.1 创建数组 1.2 使用数组 2. 数组的"名"与"实" 2.1 数组的"名" 2.2 数组的"实&q ...

  9. 1.C语言基础-给字符数组赋值

    1.定义字符数组定义时直接初始化 定义字符数组定义时直接初始化,下面例子中直接将字符串123456的首地址赋值给a char a[6]="123456"; 需要注意的是,在定义之后 ...

  10. C语言基础 - char字符串数组的概念和定义

    在c语言中,字符串是以"字符数组"存储的. #include <stdio.h> #include <Windows.h>int main(void) {c ...

最新文章

  1. MQTT消息长度限制
  2. 安装fiddler做代理,本地开发手机端看效果
  3. linux ipv6 组播地址,ipv6组播地址是什么意思
  4. Ubnutu虚拟机怎么修改开机密码?(在已知旧密码的情况下,开机后设置新的密码的方法)
  5. ORACLE TEXT DATASTORE PREFERENCE(二)
  6. LCA 最近公共祖先(RMQ、树上倍增、Tarjan),树上两点距离,线段重合长度
  7. DotNet中配置文件的使用(一)
  8. python泰坦尼克号数据预测_使用python预测泰坦尼克号生还
  9. HDnoip2017题解
  10. 变相裁员??全员营销!程序员被要求卖房~
  11. 最暖数据: 除夕有6.88亿人用微信红包传递狗年祝福
  12. WinSCP断线,WinSCP总是断线,断线重连过程又需要卡很长时间解决办法
  13. 通过学习反编译和修改IL,阅读高人的代码,提高自身的水平。 【转】
  14. 使用 rem 布局的优缺点?
  15. 对三极管特性曲线的理解
  16. 史蒂夫·保罗·乔布斯
  17. UIautomator2:APP自动化测试方法与小技巧记录(文末附实用APP测试脚本编写模板)
  18. 债券收益率预测模型_ARIMA模型在中国移动债券收益预测中的应用
  19. 通过access口加vlan标签吗_[转载]vlan与trunk打标签过程
  20. 华为与android连接方法,华为手机怎样与电脑连接?安卓手机连接电脑的方法介绍...

热门文章

  1. 现代光学字符识别技术综述
  2. python内嵌浏览器_内嵌web浏览器
  3. PGIS平台部署中的问题及解决方案
  4. 成神之路——实施工程师
  5. Pinyin 拼音转换工具类
  6. Linux 私房菜 笔记(完结)
  7. 看逐浪CMS技术小哥做SVG动画(附使用Bodymovin和Lottie将Adobe After Effects(AE)程式转为 HTML5/Android/iOS原生的动画全过程-即AE转svg\c
  8. 仿QQ音乐(HTML+CSS)
  9. 你好2019,我是全新的CPDA数据分析师课程
  10. 得到app产品体验报告