1.數組排序有很多方法比如for,while循環去進行冒泡排序或者快速看、排序等多種排序方法
而我在這里要說的是蘋果API提供的幾個系統方法
a.迭代器 Descriptor
b.方法比較 Selector
c.函數比較 Function
d.塊代碼 Block自定義
2.示例
1.1一個要比較對象的類(Person)
@interface Person : NSObject@PRoperty(nonatomic , copy)NSString * name;@property(nonatomic , copy)NSString * phone;@property(nonatomic , assign)int age;@end
1.2自定義幾個Person對象(在其他類中)
Person *person1 = [[Person alloc] init]; person1.name = @"gulong"; person1.age = 23; Person *person2 = [[Person alloc] init]; person2.name = @"guzheng"; person2.age = 24; Person *person3 = [[Person alloc] init]; person3.name = @"zhangsan"; person3.age = 21; Person *person4 = [[Person alloc] init]; person4.name = @"lisi"; person4.age = 25; NSArray *originalArray = @[person1,person2,person3,person4];
1.3排序開始
1.3.1 使用迭代器進行排序
使用NSSortDescriptor可以很方便的進行多條件排序
NSSortDescriptor *sorter1 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSSortDescriptor *sorter2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO]; NSArray *modifyArray1 = [originalArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sorter1,sorter2,nil]];
//首先通過name的字母進行升序排序,然后進行age大小比較進行降序排序
//數組通過sortedArrayUsingDescriptors可以進行多重排序(就是相等時就進行下一個比較迭代器)
1.3.2 使用SEL方法排序
首先需要在對象類里面定義并且在實現類里面實現這一方法(OC方法),該方法返回一個NSComparisonResult的枚舉值(其實就是-1,0,1),然后NSArray調用sortedArrayUsingSelector這個方法時內部會進行相應的比較排序
Person.h
- (NSComparisonResult)compareAgeAscende:(id)other;
Person.m
- (NSComparisonResult)compareAgeAscende:(id)other{ Person *otherPerson = (Person *)other; if (self.age > otherPerson.age) { return NSOrderedDescending; }else{ if (self.age == otherPerson.age) { return NSOrderedSame; }else{ return NSOrderedAscending; } }}
下面是調用 sortedArrayUsingSelector
ViewController (- (void)viewDidLoad) NSArray *modifyArray2 = [originalArray sortedArrayUsingSelector:@selector(compareAgeAscende:)]; NSLog(@"modifyArray2 : %@",modifyArray2);
注: a.當數組里面對象是NSString時可以用compare:進行sel比較
1.3.3 函數比較 該函數是一個比較函數(C語言),該函數同樣是放回NSComparisonResult這個枚舉,其實就是一個NSInteger的整數,然后NSArray調用sortedArrayUsingFunction這個方法時內部會進行相應的比較排序
// 定義在viewController里面(其實定義在哪里無所謂,主要是可以調用到就行)NSInteger personSort(id obj1,id obj2 ,void * context){ Person *person1 = (Person *)obj1; Person *person2 = (Person *)obj2; return [person1.name localizedCompare:person2.name];}
NSArray *modifyArray3 = [originalArray sortedArrayUsingFunction:personSort context:NULL]; NSLog(@"modifyArray3 : %@",modifyArray3);
1.3.4 block比較 該block里面定義寫一個比較的代碼塊,該代碼塊同樣返回NSComparisonResult這個枚舉
NSArray *modifyArray4 = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { Person *pers1 = (Person *)obj1; Person *pers2 = (Person *)obj2; if (pers1.age > pers2.age) { return NSOrderedDescending; }else if (pers1.age < pers2.age){ return NSOrderedAscending; }else{ return NSOrderedSame; } }]; NSLog(@"modifyArray4 : %@",modifyArray4);
1.4 字符串(帶漢字)轉拼音字符串 (為了上面的比較問題,為了更多需求)
- (NSString *) phonetic:(NSString*)sourceString { NSMutableString *source = [sourceString mutableCopy]; CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO); CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO); return source;}
//漢字轉拼音后會以空格隔開
新聞熱點
疑難解答