iOS开发 ☞ 数组常用方法

首先回顾一下字符串的比较方法
1、compare方法

(1)使用compare方法比较字符串返回值有三种:分别为NSOrderedAscending(-1)、NSOrderedSame(0)、NSOrderedDescending(1)。
(2)这种比较方式是按照字母顺序进行比较,区分大小写
(3)对于比较的结果可以这样理解,如果前一个字符串大,那么形成降序,也就是如果A>B 返回 NSOrderedDescending(1)。

NSString *test1 = @"asd";
    NSString *test2 = @"agd";
    BOOL result = [test1 compare:test2] == NSOrderedDescending;
    //结果为1
    NSLog(@"%d",result);
NSString *test1 = @"aSd";
    NSString *test2 = @"agd";
    BOOL result = [test1 compare:test2] == NSOrderedDescending;
    //结果为0
    NSLog(@"%d",result);

2、caseInsensitiveCompare方法
不考虑大小写比较字符串

NSString *test1 = @"aSd";
    NSString *test2 = @"agd";
    BOOL result = [test1 caseInsensitiveCompare:test2] == NSOrderedDescending;
    //结果为1
    NSLog(@"%d",result);

3、 NSNumericSearch
比较字符串的字符个数,而不是值

NSString *test1 = @"aSdq";
    NSString *test2 = @"agd";
    BOOL result = [test1 compare:test2 options:NSNumericSearch | NSCaseInsensitiveSearch] == NSOrderedDescending;
    //结果为1
    NSLog(@"%d",result);

//必须先含有忽略大小写的条件

    NSString *test1 = @"agSq";
    NSString *test2 = @"agd";
    BOOL result = [test1 compare:test2 options:NSNumericSearch] == NSOrderedDescending;
    //结果为0
    NSLog(@"%d",result);

接下来看看数组的排序:
一、使用sortedArrayUsingSelector:
(1)使用字符串自带方法

NSArray *array = @[@"aaa",@"zsa",@"Ba",@"zsaa"];
    NSArray *sortArr = [array sortedArrayUsingSelector:@selector(compare:)];

    [sortArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@",obj);
    }];

//说明如下:结合上面的字符串比较方法,不难得到下面的结论
1、升序排列
2、区分字母大小写
3、只是对英文字符串可以排序

相应的可以得到忽略大小写的排序方法

NSArray *array = @[@"aaa",@"zsa",@"Ba",@"zsaa"];
    NSArray *sortArr = [array sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    [sortArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@",obj);
    }];

二、使用block形式sortUsingComparator:
定义一个User类

@interface User : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) BOOL isFemale;
@end

//对于可变数组,可以使用无返回值的方法,默认对当前数组排序,如果某个对象的比较属性一致,不会交换这两个对象的位置。

```
- (void)sortUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);//无返回值

User *u1 = [[User alloc] init];
u1.name = @”e”;
u1.age = 11;
u1.isFemale = YES;

User *u2 = [[User alloc] init];
u2.name = @"t";
u2.age = 14;
u2.isFemale = NO;

User *u3 = [[User alloc] init];
u3.name = @"a";
u3.isFemale = YES;
u3.age = 14;

User *u4 = [[User alloc] init];
u4.name = @"a";
u4.age = 5;
u4.isFemale = NO;
NSMutableArray *mmmm = [[NSMutableArray alloc] initWithObjects:u2,u1,u3, nil];
[mmmm sortUsingComparator:^NSComparisonResult(User *  _Nonnull obj1, User *  _Nonnull obj2) {
    if (obj1.age > obj2.age) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    if (obj1.age < obj2.age) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

//结果为按照user模型姓名升序排列的数组
[mmmm enumerateObjectsUsingBlock:^(User * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@”%d”,obj.age);
}];

对于不可变数组,需要有一个数组去接收排序结果,才能达到与上面同样的效果,需要使用有返回值的方法。


NSArray *sortArr = [arr sortedArrayUsingComparator:^NSComparisonResult(User  *_Nonnull obj1, User *  _Nonnull obj2) {

        if (obj1.age > obj2.age) {
            return (NSComparisonResult)NSOrderedDescending;
        }

        if (obj1.age < obj2.age) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];

    [sortArr enumerateObjectsUsingBlock:^(User *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%d",obj.age);
    }];

三、使用sortUsingDescriptors方法

NSArray *orderMethodArr = @[[[NSSortDescriptor alloc] initWithKey:@"numStr.integerValue" ascending:YES]];
    self.DataArr = [[temArr sortedArrayUsingDescriptors:orderMethodArr] mutableCopy];

四、高效排序

- (NSArray<ObjectType> *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr

五、从一个数组中删除另一个数组的内容(求补集)

NSArray *superArr = @[@"1",@"2",@"3",@"4"];
    NSArray *childArr = @[@"2",@"3",@"5"];
    NSMutableArray *mArr = [NSMutableArray arrayWithArray:superArr];
    [mArr removeObjectsInArray:childArr];
    NSLog(@"%@",mArr);

六、判断数组是否包含某个对象

- (BOOL)containsObject:(ObjectType)anObject;

关于可变数组的initWithCapacity
这个方法并不是限定数组的容量,超过容量也可以。
如果你知道最大需要的容量,那么就使用initWithCapacity:来设置,好处就是当元素个数不超过容量时,添加元素不需要重新分配内存。

获得子数组的方法
1、通过NSRange :
subarrayWithRange:通过传入一个NSRange得到一个新数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值