Objective-c 数组对象
首先我们必须知道数组的概念:数组是有序的对象集合,一般情况下,一个数组的对象都是相同类型的。数组当中也存在可变数组和不可变数组。
1. 不可变数组 (NSArray)
可变数组 NSMutable 是不可变数组的子类,下面我们先了解一下 NSArray 的用法:
下面通过一个程序例子,来看下它们的具体用法:
1)首先是创建一个数组常用的3种方法:
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
}
@end int main(int argc,char **argv){
@autoreleasepool {
// NSArray *array1 = [NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu", nil]; 普通的方法 NSArray *array1 = @[@"zhangsan",@"lisi",@"wangwu"]; // 常用的简便的方法
for(NSString *temp in array1)
NSLog(@"temp = %@",temp); NSLog(@"-----------------");
// NSArray *array2 = [NSArray arrayWithObjects:@11,@22,@33, nil];
NSArray *array2 = @[@,@,@];
for(NSNumber *temp in array2)
NSLog(@"temp = %li",[temp integerValue]); NSLog(@"-----------------");
Student *stu1 = [[Student alloc] init:@"zhgnsan" andage:];
Student *stu2 = [[Student alloc] init:@"lisi" andage:];
Student *stu3 = [[Student alloc] init:@"wangwu" andage:]; // NSArray *array3 = [NSArray arrayWithObjects:stu1,stu2,stu3, nil];
NSArray *array3 = @[stu1,stu2,stu3];
for(Student *temp in array3)
NSLog(@"name = %@,age = %i",[temp _name],[temp _age]); }
}
2)遍历数组的方法:
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
}
@end @interface NSString (print){
}
-(void)print;
@end @implementation NSString (print) -(void)print{
NSLog(@"%@",self);
} @end int main(int argc,char **argv){
@autoreleasepool {
NSArray *array1 = @[@"zhangsan",@"lisi",@"wangwu"]; //通过新增for遍历
for(NSString *temp in array1)
NSLog(@"temp = %@",temp); NSLog(@"--------------");
NSUInteger count = [array1 count];
for(NSUInteger i = ; i < count; i++)
NSLog(@"array1[%li] = %@",i,array1[i]); NSLog(@"--------------");
for(NSUInteger i = ; i < count; i++)
NSLog(@"array1[%li] = %@",i,[array1 objectAtIndex:i]); NSLog(@"--------------");
[array1 makeObjectsPerformSelector:@selector(print)];//使array中每个成员都执行一次print函数 NSLog(@"------block--------"); //通过函数遍历
[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"array1[%li] = %@",idx,obj);
if(idx == )
*stop = YES;
}]; NSLog(@"---------------");
NSEnumerator *enumer = [array1 objectEnumerator]; //通过枚举器进行遍历
NSString *temp = nil;
while(temp = [enumer nextObject]){
NSLog(@"temp = %@",temp);
} NSLog(@"---------------");
NSLog(@"array1 = %@",array1);
NSLog(@"---------------");
NSLog(@"array1 = %@",[array1 description]);
}
}
3)写入和从文件读取的方法
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
}
@end @interface NSString (print){
}
-(void)print;
@end @implementation NSString (print) -(void)print{
NSLog(@"%@",self);
} @end int main(int argc,char **argv){
@autoreleasepool {
NSArray *array1 = @[@"zhangsan",@"lisi",@"wangwu"]; //通过新增for遍历
for(NSString *temp in array1)
NSLog(@"temp = %@",temp); NSString *filename = @"name.plist";
BOOL iswrite = [array1 writeToFile:filename atomically:YES]; //写入文件
if(iswrite)
NSLog(@"write to file ok");
else
NSLog(@"write to file error"); NSArray *array2 = [NSArray arrayWithContentsOfFile:filename]; //从文件读取
[array2 makeObjectsPerformSelector:@selector(print)];
}
}
4)在数组中查找元素
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
}
@end @interface NSString (print){
}
-(void)print;
@end @implementation NSString (print) -(void)print{
NSLog(@"%@",self);
} @end int main(int argc,char **argv){
@autoreleasepool {
NSArray *array1 = @[@"zhangsan",@"lisi",@"wangwu",@"zhangsan"];
NSString *str = [array1 objectAtIndex:]; //查找指定下标的对象
NSString *str2 = array1[];
NSLog(@"str = %@,str2 = %@",str,str2); BOOL ishas = [array1 containsObject:@"wangwu"]; //按指定值查找
if(ishas)
NSLog(@"有");
else
NSLog(@"没有"); NSString *str3 = [array1 firstObject]; //获取array中的第1个数据
NSString *str4 = [array1 lastObject]; //获取array中的最后的数据
NSLog(@"str3 = %@,str4 = %@",str3,str4); NSUInteger index = [array1 indexOfObject:@"zhangsan"]; //按值找下标,第1个
NSLog(@"index = %li",index); NSUInteger index2 = [array1 indexOfObject:@"zhangsan" inRange:NSMakeRange(index + , [array1 count] - )]; //在指定范围按值查找下标
NSLog(@"index2 = %li",index2);
}
}
5)数组的添加和删除,注意这里的添加和删除并不会对原有数组产生影响,因为它是不可变的,修改后会生成一个新的数组。
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
}
@end @interface NSString (print){
}
-(void)print;
@end @implementation NSString (print) -(void)print{
NSLog(@"%@",self);
} @end int main(int argc,char **argv){
@autoreleasepool {
NSArray *array1 = @[@"zhangsan",@"lisi",@"wangwu"];
NSArray *array2 = [array1 arrayByAddingObject:@"zhaoliu"]; //将某个对象加入到数组
NSLog(@"array2 = %@",array2); NSArray *array3 = @[@"aaa",@"bbb",@"ccc"];
NSArray *array4 = [array1 arrayByAddingObjectsFromArray:array3]; //将另一个数组数据加入到一个数组中,组成一个新的数组
NSLog(@"array4 = %@",array4); // array1[0] = @"abc"; //不可变数组不能删除
NSArray *array5 = [array4 subarrayWithRange:NSMakeRange(,)]; //获得array指定范围的子数组
NSLog(@"array5 = %@",array5);
}
}
6)数组的排序
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
-(NSInteger)cmpstuname:(Student *)stu;
-(NSInteger)cmpstuage:(Student *)stu;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
} -(NSInteger)cmpstuname:(Student *)stu{
return [self._name compare:stu._name];
} -(NSInteger)cmpstuage:(Student *)stu{
return self._age - stu._age;
}
@end int main(int argc,char **argv){
@autoreleasepool {
NSArray *array1 = @[@"zhangsan",@"lisi",@"wangwu",@"zhangsan"];
NSLog(@"before sort array1 = %@",array1); NSLog(@"-------------------");
NSArray *array2 = [array1 sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"after sort array2 = %@",array2); NSLog(@"-------------------");
NSArray *array3 = [array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"after sort array3 = %@",array3); NSLog(@"-------------------");
Student *stu1 = [[Student alloc] init:@"zhangsan" andage:];
Student *stu2 = [[Student alloc] init:@"lisi" andage:];
Student *stu3 = [[Student alloc] init:@"wangwu" andage:];
NSArray *stuarray = @[stu1,stu2,stu3];
// NSArray *srotstuarr = [stuarray sortedArrayUsingSelector:@selector(cmpstuname:)]; //按名排序
NSArray *srotstuarr = [stuarray sortedArrayUsingSelector:@selector(cmpstuage:)]; //按年龄排序
for(Student *temp in srotstuarr)
NSLog(@"name = %@,age = %i",temp._name,temp._age); NSLog(@"----------------");
NSArray *sortstuarr2 = [stuarray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student * obj2) {
return [obj1._name compare:obj2._name];
}];
for(Student *temp in sortstuarr2)
NSLog(@"name = %@,age = %i",temp._name,temp._age); NSLog(@"----------------");
Student *stu4 = [[Student alloc] init:@"zhangsan" andage:];
Student *stu5 = [[Student alloc] init:@"lisi" andage:];
Student *stu6 = [[Student alloc] init:@"wangwu" andage:];
NSArray *stuarray2 = @[stu4,stu5,stu6];
NSArray *allstuarray = [stuarray arrayByAddingObjectsFromArray:stuarray2];
for(Student *temp in allstuarray)
NSLog(@"name = %@,age = %i",temp._name,temp._age); //使用描述符排序
NSSortDescriptor *namescr = [NSSortDescriptor sortDescriptorWithKey:@"_name" ascending:NO]; //第1排序为按名降序排序
NSSortDescriptor *agescr = [NSSortDescriptor sortDescriptorWithKey:@"_age" ascending:YES]; //第2排序为按年龄升序排序
NSArray *sortallstu = [allstuarray sortedArrayUsingDescriptors:@[namescr,agescr]];
NSLog(@"-------------- ");
for(Student *temp in sortallstu)
NSLog(@"name = %@,age = %i",temp._name,temp._age);
}
}
7)分割和连接
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
} @end int main(int argc,char **argv){
@autoreleasepool {
NSString *path = @"/Users/user/workspace/OCTest/OCTest";
NSArray *patharray = [path componentsSeparatedByString:@"/"]; //将字符串按指定分隔符进行分割,分割形成数组
NSLog(@"patharray = %@",patharray); NSString *str = [patharray componentsJoinedByString:@"-"]; //将数组中的数组用指定的分隔符连接成字符串
NSLog(@"str = %@",str);
}
}
2. 可变字符串 (NSMutable)
因为它是 NSArray 的子类,所以它继承了 NSArray 中的一些方法,所以下面只介绍它的常用的方法构建和修改。首先先看一下它的方法:
下面通过一个例子来具体看它的用法:
1)构造
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
} @end int main(int argc,char **argv){
@autoreleasepool {
// NSMutableArray *marray = @[@"zhangsan",@"lisi",@"wangwu"]; //错误,类型不一致
NSMutableArray *marray = [NSMutableArray arrayWithCapacity:];
marray.array = @[@"zhangsan",@"lisi",@"wangwu"];
for(NSString *temp in marray)
NSLog(@"temp = %@",temp); NSLog(@"----------------");
NSArray *array = @[@"zhangsan",@"lisi",@"wangwu"];
NSMutableArray *marray2 = [NSMutableArray arrayWithArray:array]; //使用一个不可数组直接构造可变数组
for(NSString *temp in marray2)
NSLog(@"temp = %@",temp); NSLog(@"----------------");
NSMutableArray *marray3 = [[NSMutableArray alloc] initWithArray:array];
for(NSString *temp in marray3)
NSLog(@"temp = %@",temp);
}
}
2)修改
#import <Foundation/Foundation.h> @interface Student : NSObject{
NSString *_name;
int _age;
}
@property (copy,nonatomic)NSString *_name;
@property (assign,nonatomic)int _age;
-(id)init:(NSString *)name andage:(int)age;
@end @implementation Student
@synthesize _name,_age; -(id)init:(NSString *)name andage:(int)age{
self = [super init]; if(self){
self->_name = [name copy];
self->_age = age;
} return self;
} @end int main(int argc,char **argv){
@autoreleasepool {
NSMutableArray *marray = [NSMutableArray array];
[marray addObject:@"zhangsan"]; //将指定对象添加到数组 NSArray *array = @[@"lisi",@"wangwu"];
[marray addObjectsFromArray:array]; //将指定数组添加数组
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray insertObject:@"zhaoli" atIndex:]; //向指定下标添加数据
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray removeLastObject]; //删除最后一个
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray removeObjectAtIndex:]; //删除指定下标
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray removeObject:@"zhangsan"]; //按值删除
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray addObject:@"aaa"];
[marray addObject:@"bbb"];
[marray removeObjectsInRange:NSMakeRange(, )]; //将指定范围的数据删除
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray addObject:@"aaa"];
[marray addObject:@"lisi"];
[marray removeObject:@"lisi" inRange:NSMakeRange(,)]; //从指定范围删除指定对象
NSLog(@"marray = %@",marray); NSLog(@"---------------");
[marray removeAllObjects]; //删除所有数据
NSLog(@"marray = %@",marray); }
}
Objective-c 数组对象的更多相关文章
- 了解JavaScript 数组对象及其方法
数组在我目前学习过的编程语言中都可以见到, 形形色色的方法也数不胜数, 不过功能都一样, 最多也就是方法名稍稍有所不同, 老外也没个准啊, 如果英语比较好的同学对于学习方法(method)来说是很快的 ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- java数组对象的浅层复制与深层复制
实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.
- MongoDB学习笔记~官方驱动嵌套数组对象的更新
回到目录 对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp ...
- jquery解析php通过ajax传过来的json二维数组对象
ajax获得php传过来的json二维数组对象,jquery解析 php代码: <?php $news = array( '武汉'=>array(1,2,3), '广州'=>arra ...
- Array.prototype.sort()对数组对象排序的方法
Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行 ...
- MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象
返回目录 一些要说的 这是一个很有意思的题目,在KO里,有对象和数组对象两种,但这两种对象对外表现都是一个function,如果希望得到他的值,需要进行函数式调用,如ko_a(),它的结果为一个具体值 ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- javascript数组对象排序
javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...
- JavaScript 中有关数组对象的方法
JS 处理数组多种方法 js 中的数据类型分为两大类:原始类型和对象类型. 原始类型包括:数值.字符串.布尔值.null.undefined 对象类型包括:对象即是属性的集合,当然这里又两个特殊的对象 ...
随机推荐
- 柯南君:看大数据时代下的IT架构(6)消息队列之RabbitMQ--案例(Publish/Subscribe起航)
二.Publish/Subscribe(发布/订阅)(using the Java Client) 为了说明这个模式,我们将构建一个简单的日志系统.它将包括两个项目: 第一个将发出日志消息 第二个将接 ...
- 详解Spring中的CharacterEncodingFilter--forceEncoding为true在java代码中设置失效--html设置编码无效
在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodin ...
- 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出
7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ...
- [poj 3678]Katu Pazzle[2-SAT常用建图法]
题意: 不说了..典型的2-SAT 常用模型: 重点: 突出"绑定性". 连线表示限制而非可行. 因为最后要求对立点不在同一强连通分量是说同一强连通中的点必须同时选. 坑: 首先是 ...
- c# webConfig中的session超时详细设置
webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...
- 【转】CoreData以及MagicalRecord (一)
先粗略的了解下CoreData中的一些核心概念 1. CoreData 的核心概念 先上两幅关键的概念图 (1)NSManagedObjectModel 托管对象模型(MOM)是描述应用程序的数据模型 ...
- Objective-C的hook方案(一): Method Swizzling
Objective-C的hook方案(一): Method Swizzling 转自:http://blog.csdn.net/yiyaaixuexi/article/details/9374411 ...
- wp8.1开发系列之安装包URI方案
应用文件使用"ms-appdata:///"开头的URI地址,安装包使用的是"ms-appx:///"开头的URI地址. 比如:读取安装包Image文件夹下的t ...
- BZOJ 1406: [AHOI2007]密码箱( 数论 )
(x+1)(x-1) mod N = 0, 枚举N的>N^0.5的约数当作x+1或者x-1... ------------------------------------------------ ...
- linux杂记(⑨)vi使用说明
基本上vi共分为三种模式,分别是[一般模式]].[编辑模式]与[指令列命令模式].这三种模式的作用是: 一般模式:以vi处理一个档案的时候,一进来该档案就是一般模式.在这个模式中,你可以使用[上下左右 ...