一、NSArray
1.注意事项:
(1)NSArray:存放大量同一性质的数据等连续内存空间,只要使用相同的变量名称,便可连续访问每一笔数据。
(2)只能存放任意OC对象, 并且是有顺序的,不能存储非OC对象(比如int\float\double\char\enum\struct等)
(3)不可变的,一旦初始化完毕后,它里面的内容就永远固定的, 不能增删改。
(4)NSArray使用NSLog()打印,输出的是小括号的格式。
(5)NSArray中不能存储nil。因为NSArray认为nil是数组的结束(nil是数组元素结束的标记),nil就是0,0也是基本数据类型(int),不能存放到NSArray中。
2.基本使用方法
1.创建数组:
- + (instancetype)array;
- + (instancetype)arrayWithObject:(id)anObject;
- + (instancetype)arrayWithObjects:(id)firstObj, ...;
- + (instancetype)arrayWithArray:(NSArray *)array;
- + (id)arrayWithContentsOfFile:(NSString *)path;
- //+ (id)arrayWithContentsOfURL:(NSURL *)url;
- //+ (instancetype)arrayWithObjects:(const ObjectType _Nonnull [])objects count:(NSUInteger)cnt;
NSArray *arr = [[NSArray alloc] init];
NSArray *arr1 = [NSArray arrayWithObject:@"a"];
NSArray *arr2 = [NSArray arrayWithObjects:@"Alice",@"Beth",@"Carol",@"Ellen", nil];
NSArray *arr3 = [NSArray arrayWithArray:arr1];
NSArray *arr4 = [NSArray arrayWithContentsOfFile:@"路径"];
2.查询数组
- - (BOOL)containsObject:(ObjectType)anObject;//是否包含某一个元素
- @property(readonly) NSUInteger count;//获取集合元素个数
- //- (void)getObjects:(ObjectType _Nonnull [])objects;不使用
- - (void)getObjects:(ObjectType _Nonnull [])objects range:(NSRange)range;//获取元素
- @property(nonatomic, readonly) ObjectType firstObject;//返回第一个元素
- @property(nonatomic, readonly) ObjectType lastObject;//返回最后一个元素
- - (ObjectType)objectAtIndex:(NSUInteger)index;//获得index位置的元素
- - (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;
- - (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx;
- - (NSUInteger)indexOfObject:(id)anObject;//查找anObject元素在数组中的位置(最小下标)(如果找不到,返回-1)
- - (NSEnumerator<ObjectType> *)objectEnumerator;
- - (NSEnumerator<ObjectType> *)reverseObjectEnumerator;
- - (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;//在range范围内查找anObject元素在数组中的位置
//是否包含某一个元素
//- (BOOL)containsObject:(id)anObject;
BOOL t = [arr containsObject:c];
//获取集合元素个数
//- (NSUInteger)count;
int tlen = [sortedArray count];
//返回第一个元素
//- (id)firstObject;
NSString *m = [arr firstObject];
//返回最后一个元素
//- (id)lastObject;
NSString *m = [arr lastObject];
//获得index位置的元素
//- (id)objectAtIndex:(NSUInteger)index;
NSInteger find = [arr indexOfObject:b];
//查找anObject元素在数组中的位置(最小下标)(如果找不到,返回-1)
//- (NSUInteger)indexOfObject:(id)anObject;
NSUInteger r = [arr indexOfObject:@"a"];
//在range范围内查找anObject元素在数组中的位置
//- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
NSUInteger rm = [arr indexOfObject:@"a" inRange:NSMakeRange(2, 3)];
3.数组遍历
//数组的遍历
for (NSInteger i = 0; i < [arr count]; i++) {
NSLog(@"arr[%ld] = %@",i,arr[i]);
}
//快速枚举法(快速遍历)
for (id arr2Q in arr2) {
NSLog(@"arr2Q = %@",arr2Q);
}
[arr2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == 1) {
*stop = YES;
}
NSLog(@"obj = %@, idx = %lu", obj, idx);
}];
4.数组排序
//方法一:
NSArray *arr2 = [NSArray arrayWithObjects:@15,@5,@0,@9, nil];
NSArray *sortArr4 = [arr2 sortedArrayUsingComparator:^NSComparisonResult/*代码块返回值类型*/(id obj1, id obj2)
{
return [obj1 compare:obj2];//根据比较结果,如果结果是1,则交换
}];
NSLog(@"%@",sortArr4);
//方法二:
NSArray *sortArr = @[@"4",@"1",@"5",@"3"];
NSArray *sortArr1 = [sortArr sortedArrayUsingSelector/*排序数组使用选择器*/:@selector(compare:)];
// @selector是关键字(告诉编译器要执行一个方法),后面跟的是函数或自定义函数,总之就是具有比较功能,能返回NSComparisonResult类型的函数
//compare:返回调用结果比较:不带任何选项的选择:范围:和接收机的全部范围。
NSLog(@"%@",sortArr1);
// IOS提供一个sortedArrayUsingSelector ()函数,用于对字符串数组进行排序,方法会在排序后返回一个新的数组。
//[array sortedArrayUsingSelector (@selector(xxxx:))];
//xxxx:方法需要你自己根据实际情况设定排序方式。有默认的排序方法 compare :
排序结果:
compare:是一个自带方法,可以比较基础的数字的排序结果,但是当我们数组的元素不仅仅是数字时,就需要我们自定义compare方法:比如:定义Student.h文件,首先声明了名字name和年龄age的属性,后面声明了前面讲到的需要取代替"compare:"的一个比较方法,就是自定义方法。
@interface Student : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign) int age;
//比较name的方法,返回Foundation框架方法的够处理的NSComparisonResult类型
-(NSComparisonResult)compareWithName:(Student *)stu;
//比较age的方法,返回Foundation框架方法的够处理的NSComparisonResult类型
-(NSComparisonResult)compareWithAge:(Student *)stu;
@end
Student.m中:
@implementation Student
-(NSComparisonResult)compareWithName:(Student *)stu
{
return [self.name compare:stu.name];
}
-(NSComparisonResult)compareWithAge:(Student *)stu
{
if( self.age < stu.age ) return -1;
else if( self.age == stu.age ) return 0;
else return 1;
}
-(NSString *)description//方法重写
{
return [NSString stringWithFormat:@"%@,%i",_name,_age];
}
@end
主函数中:
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Student *student1 = [[Student alloc] init];
Student *student2 = [[Student alloc] init];
Student *student3 = [[Student alloc] init];
student1.name = @"zhangsan";
student1.age = 16;
student2.name = @"lisi";
student2.age = 20;
student3.name = @"wangwu";
student3.age = 23;
NSArray *myAray = @[student1,student2,student3];
NSArray *meToArray = [myAray sortedArrayUsingSelector:@selector(compareWithName:)];
NSArray *comeToArray = [myAray sortedArrayUsingSelector:@selector(compareWithAge:)];
//NSLog(@"%@",meToArray);//打印的是地址
//NSLog(@"%@",comeToArray);
NSLog(@"%@",meToArray);//打印的是地址
NSLog(@"%@",comeToArray);
}
return 0;
}
结果:当名字为英文字母时,按照英文字母个数对name进行排序,而当名字为汉字时,排序结果为地址,且不进行排序
5.NSArray和NSString转换
//方法一:
NSArray *arr = @[@"mon",@"tue",@"wed",@"thu",@"fri",@"sat",@"sun"];
// 1.定义一个可变字符串保存拼接之后的结果
NSMutableString *strM = [NSMutableString string];
// 2.遍历数组, 取出数组中的每一个元素, 将元素添加到可变字符串中
for (NSString *str in arr) {
[strM appendString:str];
// 3.每次添加完毕之后再添加一个-
[strM appendString:@"-"];
}
[strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
NSLog(@"strM = %@", strM);
//结果:strM = mon-tue-wed-thu-fri-sat-sun
//方法二:
//把数组元素链接成字符串,用**作拼接符将数组元素拼接成一个字符串
NSString *str = [arr componentsJoinedByString:@"**"];
NSLog(@"str = %@", str);
//结果:str = mon**tue**wed**thu**fri**sat**sun
二、NSMutableArray可变数组
1.注意事项:
(1)NSMutableArray为可变数组,可以进行创建,添加,删除,替换等
2.基本使用方法:
//1.创建并设定数组元素个数
NSMutableArray *muArr1 = [NSMutableArray arrayWithCapacity:7];
//2.复制数组
NSArray *arr2 = @[@"mon",@"tue",@"wed",@"thu",@"fri",@"sat",@"sun"];
NSMutableArray *muArr2 = [NSMutableArray arrayWithArray:arr2];
//3.1向数组中添加一个元素
[muArr2 addObject:@"eig"];
//3.2向数组中添加多个元素时,通过数组复制
[muArr2 addObjectsFromArray:arr2];
//4.1根据指定下标插入一个元素
[muArr2 insertObject:@"lin" atIndex:8];
//4.2根据指定下标插入多个元素,通过数组复制添加
NSIndexSet *inS = [NSIndexSet indexSetWithIndex:4];
[muArr2 insertObjects:arr2 atIndexes:inS];
//5.1删除最后一个元素
[muArr2 removeLastObject];
//5.2根据指定下标删除元素
[muArr2 removeObjectAtIndex:6];
//5.3根据指定对象删除元素(若未找到返回NSNotfind)
[muArr2 removeObject:@"in"];
//5.4删除全部元素
[muArr2 removeAllObjects];
//6替换指定下标的元素
[muArr2 replaceObjectAtIndex:0 withObject:@"one"];