首页 > 代码库 > 数组的排序及筛选

数组的排序及筛选

sortedArrayUsingComparator

NSArray *array = @[@"4",@"2",@"3",@"1",@"3"];NSLog(@"排序前: %@",array);NSComparator comparator = ^(id obj1, id obj2){    if([obj1 integerValue] > [obj2 integerValue])    {        return NSOrderedDescending;    }    if([obj1 integerValue] < [obj2 integerValue])    {        return NSOrderedAscending;    }    return NSOrderedSame;        //return (arc4random() % 3) - 1; //随机排序};array = [array sortedArrayUsingComparator:comparator];NSLog(@"排序后: %@",array);
sortedArrayUsingComparator

 

sortedArrayUsingFunction:customSort

 

- (void)viewDidLoad{    [super viewDidLoad];    NSArray *array = @[@"4",@"2",@"3",@"1",@"3"];    NSLog(@"排序前: %@",array);        array = [array sortedArrayUsingFunction:customSort context:nil];    NSLog(@"排序后: %@",array);}         NSInteger customSort(id obj1, id obj2, void* context){     if ([obj1 integerValue] > [obj2 integerValue])     {         return NSOrderedDescending;     }          if ([obj1 integerValue] < [obj2 integerValue])     {         return NSOrderedAscending;     }     return NSOrderedSame;}
sortedArrayUsingFunction:customSort

 

 

sortUsingDescriptors

 

#import <Foundation/Foundation.h>@interface TopMenuItem : NSObject@property (strong, nonatomic) NSString *title;@property (assign, nonatomic) NSInteger order;@property (assign, nonatomic) BOOL selected;@end#import "TopMenuItem.h"@implementation TopMenuItem- (NSString *)description{    return [NSString stringWithFormat:@"title:%@, order:%d, selected:%d",self.title,self.order,self.selected];}@end- (void)viewDidLoad{    [super viewDidLoad];        NSMutableArray *channelArray = [NSMutableArray array];        TopMenuItem *item = [[TopMenuItem alloc] init];    item.title = @"要闻";    item.order = 1;    item.selected = YES;    [channelArray addObject:item];        item = [[TopMenuItem alloc] init];    item.title = @"半导体照明";    item.selected = YES;    item.order = 3;    [channelArray addObject:item];        item = [[TopMenuItem alloc] init];    item.title = @"电子工程";    item.selected = YES;    item.order = 2;    [channelArray addObject:item];        item = [[TopMenuItem alloc] init];    item.title = @"光通讯";    item.selected = NO;    item.order = 3;    [channelArray addObject:item];    NSLog(@"排序前");    for (TopMenuItem *item in channelArray)    {        NSLog(@"%@",item);    }        NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"order" ascending:YES];    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"selected" ascending:YES];        [channelArray sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];        NSLog(@"排序后");    for (TopMenuItem *item in channelArray)    {        NSLog(@"%@",item);    }}
sortUsingDescriptors

 

 

makeObjectsPerformSelector

 

这个方法可以让数组内的所有元素都执行同一个对象方法,在特定场合可以替代for循环使用。

还是沿用上面例子里的TopMenuItem类,新加入一个方法:

- (void)testFun:(NSString *)str{    NSLog(@"testFun,param is:%@,title is %@",str,self.title);}

然后就可以这样调用:

[channelArray makeObjectsPerformSelector:@selector(testFun:) withObject:@"测试"];

 

NSPredicate

 

Cocoa框架中的NSPredicate主要用于查询并过滤元素,比较类似于Sql语句中的where,使用方法如下:

NSArray *array = @[@"A",@"AB",@"ABC",@"D",@"DF"];NSLog(@"排序前: %@",array);NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF Contains ‘A‘"];NSArray *newArray = [array filteredArrayUsingPredicate:predicate];NSLog(@"排序后: %@",newArray);

如果是NSMutableArray,则可以直接调用filterUsingPredicate来过滤原数组。

比较运算符

>  >=  <  <=  ==  !=(或<>)

 

NSMutableArray *array = [NSMutableArray arrayWithArray:@[[NSNumber numberWithInt:1],                                                         [NSNumber numberWithInt:4],                                                         [NSNumber numberWithInt:23],                                                         [NSNumber numberWithInt:999],                                                         [NSNumber numberWithInt:83],]];NSLog(@"原数组: %@",array);NSString *filterString = @"SELF>50"; //get 83,999filterString = @"SELF==23"; //get 23filterString = @"SELF<=23"; //get 1,4,23    NSPredicate *predicate = [NSPredicate predicateWithFormat:filterString];    [array filterUsingPredicate:predicate];NSLog(@"过滤后: %@",array);
Code

 

范围运算符

 

IN  BETWEEN

 

 

NSMutableArray *array = [NSMutableArray arrayWithArray:@[[NSNumber numberWithInt:1],                                                         [NSNumber numberWithInt:4],                                                         [NSNumber numberWithInt:23],                                                         [NSNumber numberWithInt:999],                                                         [NSNumber numberWithInt:83],]];NSLog(@"原数组: %@",array);NSString *filterString = @"SELF BETWEEN {4,50}"; //get 4,23filterString = @"SELF IN {23,999}"; //get 23,999NSPredicate *predicate = [NSPredicate predicateWithFormat:filterString];[array filterUsingPredicate:predicate];NSLog(@"过滤后: %@",array);
Code

 

字符串比较

LIKE  BEGINWITH  CONTAINS  ENDSWITH  MATCHES

 

NSArray *array = @[@"park",@"army",@"phone",@"warrior",@"stone",@"ear",@"apple",@"application",@"wear"];NSString *filterString = @"SELF LIKE[cd] ‘*ar‘"; //get "ear","wear"filterString = @"SELF LIKE[cd] ‘?ar‘"; //get "ear"filterString = @"SELF LIKE[cd] ‘?ar?‘"; //get "park"filterString = @"SELF LIKE[cd] ‘?ar*‘ && SELF ENDSWITH[cd] ‘r‘"; //get "warrior","ear"filterString = @"SELF BEGINSWITH[cd] ‘e‘ || SELF BEGINSWITH[cd] ‘s‘"; //get "stone","ear"(匹配以"e"或"s"开头的单词)filterString = @"SELF BEGINSWITH[cd] ‘app‘"; //get "apple","application"filterString = @"SELF ENDSWITH[cd] ‘one‘"; //get "stone","phone"filterString = @"SELF MATCHES[cd] ‘^w.+r$‘"; //get "warrior","wear"(正则匹配以"w"开头,"r"结尾的单词)NSPredicate *predicate = [NSPredicate predicateWithFormat:filterString];NSLog(@"过滤结果: %@",[array filteredArrayUsingPredicate:predicate]);
Code

 

上面的例子都是直接利用SELF比较,如果数组存储的是对象,要以对象的属性值作为筛选目标可以这样:

NSMutableArray *channelArray = [NSMutableArray array];TopMenuItem *item = [[TopMenuItem alloc] init];item.title = @"要闻";item.order = 1;item.selected = YES;[channelArray addObject:item];item = [[TopMenuItem alloc] init];item.title = @"半导体照明";item.selected = NO;item.order = 5;[channelArray addObject:item];item = [[TopMenuItem alloc] init];item.title = @"电子工程";item.selected = YES;item.order = 2;[channelArray addObject:item];item = [[TopMenuItem alloc] init];item.title = @"光通讯";item.selected = NO;item.order = 3;[channelArray addObject:item];item = [[TopMenuItem alloc] init];item.title = @"太阳能光伏";item.selected = YES;item.order = 4;[channelArray addObject:item];NSString *filterString = @"title CONTAINS[cd] ‘光‘";filterString = @"selected==1";filterString = @"order BETWEEN {3,5}";NSPredicate *predicate = [NSPredicate predicateWithFormat:filterString];NSArray *filteredArray = [channelArray filteredArrayUsingPredicate:predicate];for (TopMenuItem *item in filteredArray){    NSLog(@"%@",item);}
Code

 

 

 

 

 

 

数组的排序及筛选