OC语言基础八:OC数组
文章目录
- 不可变数组
- 创建
- 取出数组中元素
- 遍历数组
- 排序
- 对自定义的类进行排序
- 方法选择器
- 排序描述器
- 其他方法
- 数组第一个元素和最后一个元素
- 数组元素拼接成字符串
- 可变数组
- 添加元素
- 插入元素
- 删除元素
- 替换元素
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数组相关推荐
- go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)
go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...
- [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等
Extends Coc .EnhancedCc++/ .C-like c# 会在github上开源一个库,如果是私有库要交钱,自己o公司的项目不要勾 会把源代码提交上去 <span style= ...
- OC语言基础 - 01
OC语言源自于C语言,但是在C语言的基础上增加了不少OC特有的东西.因此有C语言和面向对象语言基础的同学还是可以很快掌握OC语言的. 在OC语言中,使用#import来代替C语言中的#include. ...
- OC语言基础内容 类的定义 第一个OC
OC基础day01 第一个OC程序 OC与C的基本区别 C语言的源文件 XXX.c OC语言的源文件 XXX.m 在C语言中 用printf打印信息 OC中用NSLog()打印信息 OC中的改变 OC ...
- OC语言基础一:OC方法调用机制,new方法实现原理
文章目录 OC方法调用机制 new方法实现原理 野指针 内存溢出 内存泄漏 alloc和init OC方法调用机制 OC有两种方法 Person *person=[Person new]; [pers ...
- 关于OC语言基础的总结
原文地址:http://www.kankanews.com/ICkengine/archives/24423.shtml 1.OC的动态性 oc的动态性让程序可以在运行时判断其该有的行为,而不是像c等 ...
- [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习
一.类学习引入 //缺点 _result的结果一直在变化,得创建变量,在堆区一直申请空间 <span style="font-size:14px;">#import&l ...
- Java程序设计语言基础04:数组
目录 1. 数组基础 1.1 创建数组 1.2 使用数组 2. 数组的"名"与"实" 2.1 数组的"名" 2.2 数组的"实&q ...
- 1.C语言基础-给字符数组赋值
1.定义字符数组定义时直接初始化 定义字符数组定义时直接初始化,下面例子中直接将字符串123456的首地址赋值给a char a[6]="123456"; 需要注意的是,在定义之后 ...
- C语言基础 - char字符串数组的概念和定义
在c语言中,字符串是以"字符数组"存储的. #include <stdio.h> #include <Windows.h>int main(void) {c ...
最新文章
- MQTT消息长度限制
- 安装fiddler做代理,本地开发手机端看效果
- linux ipv6 组播地址,ipv6组播地址是什么意思
- Ubnutu虚拟机怎么修改开机密码?(在已知旧密码的情况下,开机后设置新的密码的方法)
- ORACLE TEXT DATASTORE PREFERENCE(二)
- LCA 最近公共祖先(RMQ、树上倍增、Tarjan),树上两点距离,线段重合长度
- DotNet中配置文件的使用(一)
- python泰坦尼克号数据预测_使用python预测泰坦尼克号生还
- HDnoip2017题解
- 变相裁员??全员营销!程序员被要求卖房~
- 最暖数据: 除夕有6.88亿人用微信红包传递狗年祝福
- WinSCP断线,WinSCP总是断线,断线重连过程又需要卡很长时间解决办法
- 通过学习反编译和修改IL,阅读高人的代码,提高自身的水平。 【转】
- 使用 rem 布局的优缺点?
- 对三极管特性曲线的理解
- 史蒂夫·保罗·乔布斯
- UIautomator2:APP自动化测试方法与小技巧记录(文末附实用APP测试脚本编写模板)
- 债券收益率预测模型_ARIMA模型在中国移动债券收益预测中的应用
- 通过access口加vlan标签吗_[转载]vlan与trunk打标签过程
- 华为与android连接方法,华为手机怎样与电脑连接?安卓手机连接电脑的方法介绍...