首先回顾一下字符串的比较方法
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得到一个新数组