iOS——NSArray&NSMutableArray

一、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"];

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值