1.數組排序有很多方法比如for,while迴圈去進行冒泡排序或者快速看、排序等多種排序方法 而我在這裡要說的是蘋果API提供的幾個系統方法 a.迭代器 Descriptor b.方法比較 Selector c.函數比較 Function d.塊代碼 Block自定義 2.示例 1.1一個要比較對象 ...
1.數組排序有很多方法比如for,while迴圈去進行冒泡排序或者快速看、排序等多種排序方法
而我在這裡要說的是蘋果API提供的幾個系統方法
a.迭代器 Descriptor
b.方法比較 Selector
c.函數比較 Function
d.塊代碼 Block自定義
2.示例
1.1一個要比較對象的類(Person)
1 2 3 4 5 6 7 8 9 |
@interface Person : NSObject
@property ( nonatomic , copy ) NSString * name;
@property ( nonatomic , copy ) NSString * phone;
@property ( nonatomic , assign) int age;
@end
|
1.2自定義幾個Person對象(在其他類中)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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可以很方便的進行多條件排序
1 2 3 |
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這個方法時內部會進行相應的比較排序
1 |
Person.h<br>- ( NSComparisonResult )compareAgeAscende:( id )other;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Person.m<br>- ( 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
1 2 3 |
ViewController (- ( void )viewDidLoad)
NSArray *modifyArray2 = [originalArray sortedArrayUsingSelector: @selector (compareAgeAscende:)];
NSLog (@ "modifyArray2 : %@" ,modifyArray2);
|
註: a.當數組裡面對象是NSString時可以用compare:進行sel比較
1.3.3 函數比較 該函數是一個比較函數(C語言),該函數同樣是放回NSComparisonResult這個枚舉,其實就是一個NSInteger的整數,然後NSArray調用sortedArrayUsingFunction這個方法時內部會進行相應的比較排序
1 2 3 4 5 6 |
// 定義在viewController裡面(其實定義在哪裡無所謂,主要是可以調用到就行)
NSInteger personSort( id obj1, id obj2 , void * context){
Person *person1 = (Person *)obj1;
Person *person2 = (Person *)obj2;
return [person1.name localizedCompare:person2.name];
}
|
1 2 |
NSArray *modifyArray3 = [originalArray sortedArrayUsingFunction:personSort context: NULL ];
NSLog (@ "modifyArray3 : %@" ,modifyArray3);
|
1.3.4 block比較 該block裡面定義寫一個比較的代碼塊,該代碼塊同樣返回NSComparisonResult這個枚舉
1 2 3 4 5 6 7 8 9 10 11 12 |
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 字元串(帶漢字)轉拼音字元串 (為了上面的比較問題,為了更多需求)
1 2 3 4 5 6 |
- ( NSString *) phonetic:( NSString *)sourceString {
NSMutableString *source = [sourceString mutableCopy];
CFStringTransform((__bridge CFMutableStringRef)source, NULL , kCFStringTransformMandarinLatin, NO );
CFStringTransform((__bridge CFMutableStringRef)source, NULL , kCFStringTransformStripDiacritics, NO );
return source;
}<br> //漢字轉拼音後會以空格隔開
|