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> //汉字转拼音后会以空格隔开
|
时间: 2024-12-20 06:41:34