前言

  • 数组只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil 。
  • Xcode 7 对系统中常用的一系列容器类型都增加了泛型支持(),有了泛型后就可以指定容器类中对象的类型了。
  • 假如向泛型容器中加入错误的对象,编译器会报警告。
    • __covariant:协变性,子类型可以强转到父类型(里氏替换原则)。
    • __contravariant:逆变性,父类型可以强转到子类型。
  • 不指定泛型类型的对象可以和任意泛型类型转化,但指定了泛型类型后,两个不同类型间是不可以强转的,
  • 假如你希望主动控制转化关系,就需要使用泛型的协变性和逆变性修饰符。

1、不可变数组 NSArray 的创建

// 直接创建不可变数组
/*
数组成员是 id 类型,表示数组元素可以是任意的 oc 对象。
*/
NSArray *arr1 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];// 对象方法创建NSArray *arr2 = [[NSArray alloc] init];// 和 arr1 的地址不相同
NSArray *arr3 = [[NSArray alloc] initWithArray:arr1];NSArray *arr4 = [[NSArray alloc] initWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];// 类方法创建NSArray *arr5 = [NSArray array];// 和 arr1 的地址不相同
NSArray *arr6 = [NSArray arrayWithArray:arr1];// 创建只有一个元素(id)的数组
NSArray *arr7 = [NSArray arrayWithObject:@"qian"];NSArray *arr8 = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];// 从 文件 创建字符串
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];NSArray *arr9 = [[NSArray alloc] initWithContentsOfFile:path];
NSArray *arr10 = [NSArray arrayWithContentsOfFile:path];// 从 Url 创建字符串
/*
file:// 文件前缀
*/
NSURL *url = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"]]];NSArray *arr11 = [[NSArray alloc] initWithContentsOfURL:url];
NSArray *arr12 = [NSArray arrayWithContentsOfURL:url];// 泛型定义// 指明数组中存放的是 NSString 类型数据
NSArray<NSString *> *arr13 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];// 指明数组中存放的是 NSNumber 类型数据
NSArray<NSNumber *> *arr14 = @[@2, @4, @6, @8, @10];

2、数组成员个数计算

NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];NSUInteger length = [arr count];

3、从数组中取成员

NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];// []
NSArray *arr1 = arr[1];// objectAtIndex
NSArray *arr2 = [arr objectAtIndex:2];// subarrayWithRange
NSArray *arr3 = [arr subarrayWithRange:NSMakeRange(2, 2)];// for...in 循环
/*
取出数组中的每个元素,分别保存在 tmp 中
*/
for (NSString *tmp in arr) {NSLog(@"%@", tmp);
}// id (void *) 泛型指针, 取出数组中的每个元素,分别保存在 tmp 中
for (id tmp in arr) {NSLog(@"tmp = %@", tmp);
}

4、取数组中最后一个元素

NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];id lastObject1 = [arr lastObject];id lastObject2 = arr[[arr count]-1];

5、由元素的值获取下标

NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];NSUInteger index = [arr indexOfObject:@"huan"];

6、判断数组中是否包含某个元素

NSArray *arr = @[@"bei", @"jing", @"huan", @"ying", @"nin"];BOOL result = [arr containsObject:@"huan"];

7、数组的比较

NSArray *arr1 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];
NSArray *arr2 = @[@"ni", @"hao", @"bei", @"jing"];// isEqualToArray// 比较两个数组内容是否相同
BOOL bl = [arr1 isEqualToArray:arr2];// firstObjectCommonWithArray// 返回两个数组中第一个相同的元素
NSString *str = [arr1 firstObjectCommonWithArray:arr2];

8、数组组合

NSArray *arr1 = @[@"bei", @"jing", @"huan", @"ying", @"nin"];
NSArray *arr2 = @[@"Users", @"JHQ0228", @"Desktop"];// 按指定字符组合
NSString *str1 = [arr1 componentsJoinedByString:@" "];// 按路径组合
/*
将数组中的元素自动组合成路径,在每个元素之间自动加上 “/”
*/
NSString *str2 = [NSString pathWithComponents:arr2];

9、可变数组 NSMutableArray 的创建

// 对象方法创建
/*
创建指定长度的数组,预先分配空间,提高效率,实际长度可大于指定长度
*/
NSMutableArray *arr1 = [[NSMutableArray alloc] initWithCapacity:0];// 类方法创建
/*
创建指定长度的数组,预先分配空间,提高效率,实际长度可大于指定长度
*/
NSMutableArray *arr2 = [NSMutableArray arrayWithCapacity:0];

10、数组元素的添加

NSMutableArray *arr = [NSMutableArray arrayWithCapacity:0];// addObject// 向数组中追加一个元素
[arr addObject:@"bei"];// addObjectsFromArray// 追加数组
NSArray *arrAdd = @[@"dian", @"ying", @"xue", @"yuan"];
[arr addObjectsFromArray:arrAdd];// insertObject... atIndex// 在数组中任意位置插入一个元素
[arr insertObject:@"hao" atIndex:2];// arrayByAddingObject// 向数组添加一个元素,返回一个新的数组
NSArray *arr1 = [arr arrayByAddingObject:@"ma"];

11、数组元素的删除

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"nan", @"jing", @"huan", @"ying", @"nin", @"bei", @"jing", @"ni", @"hao", nil];// 删除指定下标的元素
[arr removeObjectAtIndex:2];// 删除指定元素,删除所有指定元素
[arr removeObject:@"ying"];// 删除指定元素
[arr removeObjectIdenticalTo:@"nan"];// 删除指定范围的元素
NSRange range = {2,1};
[arr removeObjectsInRange:range];// 删除最后一个元素
[arr removeLastObject];// 删除所有元素
[arr removeAllObjects];

12、数组元素的替换

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"nan", @"jing", @"hao", nil];// 替换指定下标元素
[arr replaceObjectAtIndex:1 withObject:@"ren"];

13、数组元素的交换

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"bei", @"jing", @"nin", @"hao", nil];[arr exchangeObjectAtIndex:0 withObjectAtIndex:1];

14、数组元素的修改

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"bei", @"jing", @"nin", @"hao", nil];// 修改整个数组(覆盖重写)
[arr setArray:@[@"bei", @"jing", @"huan", @"ying",  @"nin"]];// 修改数组中的某个元素
arr[3] = @"huan";

15、给数组里的所有元素发送一个消息

Student *stu1 = [[Student alloc] init];
Student *stu2 = [[Student alloc] init];
Student *stu3 = [[Student alloc] init];NSArray *arr = [NSArray arrayWithObjects:stu1, stu2, stu3, nil];// 发送消息
[arr makeObjectsPerformSelector:@selector(studentTest)];

16、数组的遍历

  • 16.1 用 for 循环遍历

NSArray * array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];for (int i = 0; i < [array count]; i ++) {NSLog(@"%@", array[i]);
}
  • 16.2 用 for...in 循环遍历

NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];// id (void *) 泛型指针, 取出数组中的每个元素,分别保存在 tmp 中
for (id tmp in array) {NSLog(@"%@", tmp);
}// 取出数组中的每个元素,分别保存在 tmp 中
for (NSString *tmp in array) {NSLog(@"%@", tmp);
}
  • 16.3 用 block 循环遍历

NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {// obj == array[i],idx == iNSLog(@"%@", obj);if ([obj  isEqual: @"huan"]) {// 停止遍历*stop = YES;}
}];
  • 16.4 用迭代器遍历

NSArray *array = [NSArray arrayWithObjects:@"bei", @"jing", @"huan", @"ying", @"nin", nil];// 获取数组的正序迭代器
NSEnumerator *enu1 = [array objectEnumerator];// 获取数组的反序迭代器
NSEnumerator *enu2 = [array reverseObjectEnumerator];id obj = nil;// 正序,获取下一个需要遍历的元素
while (obj = [enu1 nextObject]) {NSLog(@"%@", obj);
}// 反序,获取下一个需要遍历的元素
while (obj = [enu2 nextObject]) {NSLog(@"%@", obj);
}
  • 16.5 条件遍历

// 1.indexesOfObjectsPassingTestNSArray *array = [NSArray arrayWithObjects:@3, @8, @17, @2, @25, @6, @89, nil];NSIndexSet *indexSet = [array indexesOfObjectsPassingTest:^BOOL(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {// 遍历数组,找出数组中所有大于 10 的元素的位置return [obj intValue] > 10 ? : NO;}];[indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {// 输出所有大于 10 的元素值NSLog(@"%@", array[idx]);
}];// 2.indexOfObjectPassingTestNSUInteger index = [array indexOfObjectPassingTest:^BOOL(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {// 遍历数组,找出数组中第一个大于 10 的元素的位置return [obj intValue] > 10 ? : NO;
}];// 输出第一个大于 10 的元素值
NSLog(@"%@", array[index]);

17、数组排序

  • 17.1 冒泡排序

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];for (int i = 0; i < [arr count] - 1; i++) {for (int j = 0; j < [arr count] - 1 - i; j++) {// 大小判断 arr[j] > arr[j + 1]if ([arr[j] compare:arr[j + 1]] == NSOrderedDescending) {// 位置交换[arr exchangeObjectAtIndex:j withObjectAtIndex:(j + 1)];}}
}
  • 17.2 用指定的方法排序

// 1.用指定的方法排序,可变数组排序NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];// 原数组的顺序改变,指定元素的比较方法:compare:,默认排序方式为升序排列
[arr1 sortUsingSelector:@selector(compare:)];// 使排序结果 降序 排列
NSEnumerator *enu = [arr1 reverseObjectEnumerator];id obj = nil;
while (obj = [enu nextObject]) {// 排序后的结果为降序NSLog(@"%@", obj);
}// 2.用指定的方法排序,不可变数组排序NSArray *arr2 = [NSArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];// 返回一个排好的数组,原数组的顺序不变,指定元素的比较方法:compare:
NSArray *arr3 = [arr2 sortedArrayUsingSelector:@selector(compare:)];// 3.用指定的方法排序,自定义类//  People.h#import <Foundation/Foundation.h>@interface People : NSObject// 名
@property (nonatomic, retain) NSString *firstname;// 姓
@property (nonatomic, retain) NSString *lastname;+ (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname;// 返回值类型为 NSComparisonResult
- (NSComparisonResult)comparePeople:(People *)peop;@end//  People.m#import "People.h"@implementation People+ (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname {People * peop = [[People alloc] init];peop.lastname = lastname;peop.firstname = firstname;return peop;
}- (NSComparisonResult)comparePeople:(People *)peop {// 先按照姓排序NSComparisonResult result = [self.lastname compare: peop.lastname];if (result == NSOrderedSame) {// 如果有相同的姓,就比较名字result = [self.firstname compare: peop.firstname];}return result;
}-(NSString *)description{return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
}@end//  main.m#import "People.h"People *peop1 = [People peopleWithFirstname:@"MingJie" lastname:@"Li"];
People *peop2 = [People peopleWithFirstname:@"LongHu" lastname:@"Huang"];
People *peop3 = [People peopleWithFirstname:@"LianJie" lastname:@"Li"];
People *peop4 = [People peopleWithFirstname:@"Jian" lastname:@"Xiao"];// 1.用指定的方法排序,可变数组排序NSMutableArray *array1 = [NSMutableArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];// 原数组的顺序改变
[array1 sortUsingSelector:@selector(comparePeople:)];// 2.用指定的方法排序,不可变数组排序NSArray *array2 = [NSArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];// 返回一个排好的数组,原数组的顺序不变
NSArray *array3 = [array2 sortedArrayUsingSelector:@selector(comparePeople:)];
  • 17.3 用 Block 排序

// 1.利用 block 进行排序,可变数组排序NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];[arr1 sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {// 指定比较的方法,两个元素值比较NSComparisonResult result = [obj1 compare:obj2];// 返回比较的结果return result;
}];// 2.利用 block 进行排序,不可变数组排序NSArray *arr2 = [NSArray arrayWithObjects:@"sunday", @"sunny", @"summer", @"sun", nil];// 返回一个排好的数组
NSArray *arr3 = [arr2 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {// 指定比较的方法,两个元素值比较NSComparisonResult result = [obj1 compare:obj2];// 返回比较的结果return result;
}];// 3.利用 block 进行排序,自定义类// People1.h#import <Foundation/Foundation.h>@interface People1 : NSObject// 名
@property (nonatomic, retain) NSString *firstname;// 姓
@property (nonatomic, retain) NSString *lastname;+ (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname;@end// People1.m#import "People1.h”@implementation People1+ (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname {People1 * peop = [[People1 alloc] init];peop.lastname = lastname;peop.firstname = firstname;return peop;
}-(NSString *)description{return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
}@end// main.m#import "People1.h”People1 *peop1 = [People1 peopleWithFirstname:@"MingJie" lastname:@"Li"];
People1 *peop2 = [People1 peopleWithFirstname:@"LongHu" lastname:@"Huang"];
People1 *peop3 = [People1 peopleWithFirstname:@"LianJie" lastname:@"Li"];
People1 *peop4 = [People1 peopleWithFirstname:@"Jian" lastname:@"Xiao"];// 1.利用 block 进行排序,可变数组排序NSMutableArray *array1 = [NSMutableArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];[array1 sortUsingComparator:^NSComparisonResult(People1 *  _Nonnull obj1, People1 *  _Nonnull obj2) {// 先按照姓排序NSComparisonResult result = [obj1.lastname compare:obj2.lastname];if (result == NSOrderedSame) {// 如果有相同的姓,就比较名字result = [obj1.firstname compare:obj2.firstname];}return result;
}];// 2.利用 block 进行排序,不可变数组排序NSArray *array2 = [NSArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];NSArray *array3 = [array2 sortedArrayUsingComparator:^NSComparisonResult(People1 *  _Nonnull obj1,
People1 *  _Nonnull obj2) {// 先按照姓排序NSComparisonResult result = [obj1.lastname compare:obj2.lastname];if (result == NSOrderedSame) {// 如果有相同的姓,就比较名字result = [obj1.firstname compare:obj2.firstname];}return result;
}];
  • 17.4 按描述器排序

//  Book.h#import <Foundation/Foundation.h>@interface Book : NSObject@property (nonatomic, retain) NSString *name;+ (id)bookWithName:(NSString *)name;@end//  Book.m#import "Book.h"@implementation Book+ (id)bookWithName:(NSString *)name {Book *book = [[Book alloc] init];book.name = name;return book;
}@end//  People2.h#import <Foundation/Foundation.h>@class Book;@interface People2 : NSObject// 名
@property (nonatomic, retain) NSString *firstname;// 姓
@property (nonatomic, retain) NSString *lastname;// 书
@property (nonatomic, retain) Book *book;+ (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname bookName:(NSString *)bookName;@end//  People2.m#import "People2.h"
#import "Book.h"@implementation People2+ (id)peopleWithFirstname:(NSString *)firstname lastname:(NSString *)lastname bookName:(NSString *)bookName {People2 *peop = [[People2 alloc] init];peop.lastname = lastname;peop.firstname = firstname;peop.book = [Book bookWithName:bookName];return peop;
}- (NSString *)description{return [NSString stringWithFormat:@"%@ %@, bookName: %@", self.firstname, self.lastname, self.book.name];
}@end// main.m#import "People2.h"People2 *peop1 = [People2 peopleWithFirstname:@"MingJie" lastname:@"Li" bookName:@"book1"];
People2 *peop2 = [People2 peopleWithFirstname:@"LongHu" lastname:@"Huang" bookName:@"book2"];
People2 *peop3 = [People2 peopleWithFirstname:@"LianJie" lastname:@"Li" bookName:@"book2"];
People2 *peop4 = [People2 peopleWithFirstname:@"Jian" lastname:@"Xiao" bookName:@"book1"];// 先按照书名进行排序
/*
这里的 key 写的是 @property 的名称
*/
NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES];// 再按照姓进行排序
NSSortDescriptor *lastnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastname" ascending:YES];// 再按照名进行排序
NSSortDescriptor *firstnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstname" ascending:YES];// 1.按描述器排序,可变数组排序NSMutableArray *array1 = [NSMutableArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];// 按顺序添加排序描述器
NSMutableArray *descs1 = [NSMutableArray arrayWithObjects:bookNameDesc, lastnameDesc, firstnameDesc, nil];[array1 sortUsingDescriptors:descs1];// 2.按描述器排序,不可变数组排序NSArray *array2 = [NSArray arrayWithObjects:peop1, peop2, peop3, peop4, nil];// 按顺序添加排序描述器
NSArray *descs2 = [NSArray arrayWithObjects:bookNameDesc, lastnameDesc, firstnameDesc, nil];NSArray *array3 = [array2 sortedArrayUsingDescriptors:descs2];

转载于:https://www.cnblogs.com/CH520/p/9448218.html

NSArray 数组相关推荐

  1. nsarray数组越界_NSArray,NSMutableArray –目标C数组

    nsarray数组越界 NSArray and NSMutableArray are the Objective C array objects. In this tutorial we'll dis ...

  2. IOS 之 NSArray 数组方法详解(3)

    NSArray 数组的创建 1.使用类方法创建 一个空的数组 + (id)array; 2.使用类方法创建 只有一个对象的数组 + (id)arrayWithObject:(id)anObject; ...

  3. iOS NSArray数组过滤

    需求:在一个数组里面,将在这个数组中的并且在另一个数组里面的元素过滤掉. 即:在一个数组dataArray里面,将在dataArray数组中的并且在filteredArray数组里面的元素过滤掉. / ...

  4. iphone NSArray 数组越界

    问题:在将数据添加到数组中去的时候,出现如下错误 疑问为:使用[NSArray addObject:anObject]  竟然报出数组越界.-[__NSArrayM insertObject:atIn ...

  5. IOS 之 NSArray 数组方法详解(4)

    1. 向数组中添加一个对象 - (void)addObject:(id)anObject; 2.向数组中指定的index 位置,插入一个新的对象 - (void)insertObject:(id)an ...

  6. [iOS]NSArray:数组(NSArray)使用注意

    数组(NSArray)添加的元素必须为对象,如果是数字,则用NSNumber封装一下. 数组不能添加nil对象.

  7. OC基础第四讲--字符串、数组、字典、集合的常用方法

    OC基础第四讲--字符串.数组.字典.集合的常用方法 字符串.数组.字典.集合有可变和不可变之分.以字符串为例,不可变字符串本身值不能改变,必须要用相应类型来接收返回值:而可变字符串调用相应地方法后, ...

  8. IOS基础之NSString,NSMutableString,NSArray的基本使用

    IOS基础之NSString,NSMutableString,NSArray的基本使用 // // main.m // Day10-Foundation框架 // // Created by 鲁军 o ...

  9. IOS数组按中文关键字以字母序排序

    本文转载至 http://blog.csdn.net/xunyn/article/details/7882087 iosobjective cuser框架通讯 IOS项目中会用到对通讯录的联系人或是会 ...

最新文章

  1. 深度学习|实例分割:3D-BoNet
  2. vue 上传图片视频组件,可拍照选择照片,解决苹果手机拍照旋转问题
  3. 人民日报钟声:以和平合作守护世界安全
  4. RHCE笔记1-安裝
  5. Javascript中的对象和原型(一)(转载)
  6. PMCAFF | 从200块到300万,史上最全自媒体报价单
  7. uva 11367 (Dijkstra+DP)
  8. 使用cocoapods
  9. Linux 零拷贝 sendfile函数中文说明及实际操作
  10. 创建ftp服务器后html,搭建ftp服务器需要用到固定IP吗
  11. flex 左右布局_面试必考点:前端布局知识
  12. oracle集群数据库事务配置,在 .NET中使用Oracle数据库事务-安装配置-Oracle频道-中国IT实验室...
  13. 学计算机编程会秃头吗,编程真的容易导致秃顶么?
  14. java远程调试服务器的工程配置
  15. Unity3D之UGUI基础7:Scrollbar卷动条
  16. C#对文件的操作(创建、获取文件数量、删除)(读、写文件)
  17. java大赛参赛学院名单,河南大学第十一届“学佳澳杯”大学生程序设计竞赛获奖名单公布...
  18. 已知三角形的三条边长,求这个三角形的外接圆的半径
  19. 既然Talk is cheap, 那么就用代码教你如何进行正交设计
  20. 医学3d图像区域增长(以肺结节为例)

热门文章

  1. android画布_Android画布
  2. python数据类型_Python数据类型
  3. halcon中编程运算符_R编程中的运算符
  4. 使用Shell和Java驱动程序的MongoDB身份验证配置示例
  5. 关于微信安卓版计步作弊器
  6. 开课吧:数据分析的价值体现在哪些方面?
  7. Mac 下安装Redis
  8. thinkphp解决分页后序列号自增的问题
  9. DR、BDR和DROther的关系之通俗演绎
  10. 设计中最困难的部分是决定设计什么