場景:根據需求讓數據內的元素有序排列。
下面是具體實例說明。
ArrayObject.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSInteger _age;
}
@property (readwrite, copy) NSString *_name;
@property (readwrite, assign) NSInteger _age;
@end
@interface ArrayObject : NSObject
-(void)testSortedArrayUsingComparater;
-(void) testSortArrayUsingSelector;
-(void) testSortedArrayUsingFunction;
-(void) doTestSortUsingDescriptors;
@end
ArrayObject.m
#import "ArrayObject.h"
@implementation Person
@synthesize _name;
@synthesize _age;
- (void)dealloc
{
[_name release];
[super dealloc];
}
@end
@implementation ArrayObject
//第一種,利用數組的sortedArrayUsingComparator調用 NSComparator ,obj1和obj2指的數組中的對象
NSComparator cmptr = ^(id obj1, id obj2){
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
};
-(void)testSortedArrayUsingComparater
{
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"10",@"13",@"5",@"15",@"8",@"20",@"1",@"5",@"3",@"7",@"45",@"4",@"23",@"",nil];
//排序前
NSMutableString *beforeStr = [NSMutableString new];
for(NSString *str in sortArray)
{
[beforeStr appendFormat:@"%@ ",str];
}
NSLog(@"排序前:%@",beforeStr);
[beforeStr release];
//第一種排序
NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
NSMutableString *afterStr = [NSMutableString new];
for(NSString *str in array){
[afterStr appendFormat:@"%@ ",str];
}
NSLog(@"排序後:%@",afterStr);
[afterStr release];
}
輸出結果:
//第二種排序算法 利用sortedArrayUsingSelector調用系統定義的compare:,主要是對字符串的比較
-(void) testSortArrayUsingSelector
{
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"10",@"13",@"5",@"15",@"8",@"20",@"1",@"5",@"3",@"7",@"45",@"4",@"23",@"",nil];
//排序前
NSMutableString *beforeStr = [NSMutableString new];
for(NSString *str in sortArray)
{
[beforeStr appendFormat:@"%@ ",str];
}
NSLog(@"排序前:%@",beforeStr);
[beforeStr release];
//第一種排序
//- (NSComparisonResult)compare:(NSString *)string;//比較字符串的大小
//- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 比較字符串,按mask的參數進行比較
//mask 參數可以是: NSCaseInsensitiveSearch, NSLiteralSearch, NSNumericSearch.
NSArray *array =[sortArray sortedArrayUsingSelector:@selector(compare:options:)];
NSMutableString *affterStr = [NSMutableString new];
for(NSString *str in array){
[affterStr appendFormat:@"%@ ",str];
}
NSLog(@"排序後:%@",affterStr);
[affterStr release];
}
輸出結果:
若把
NSArray *array =[sortArray sortedArrayUsingSelector:@selector(compare:options:)];中<pre name="code" class="objc">compare:options:改爲compare:,則輸出結果爲:
//第三種 排序方法 利用sortedArrayUsingFunction 調用 對應方法customSort,這個方法中的obj1和obj2分別是指數組中的對象。
NSInteger customSort(id obj1, id obj2,void* context){
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}
-(void) testSortedArrayUsingFunction
{
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"10",@"13",@"5",@"15",@"8",@"20",@"1",@"5",@"3",@"7",@"45",@"4",@"23",@"",nil];
//排序前
NSMutableString *beforeStr = [NSMutableString new];
for(NSString *str in sortArray){
[beforeStr appendFormat:@"%@ ",str];
}
NSLog(@"排序前:%@",beforeStr);
[beforeStr release];
NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
NSMutableString *afterStr = [NSMutableString new];
for(NSString *str in array){
[afterStr appendFormat:@"%@ ",str];
}
NSLog(@"排序後:%@",afterStr);
[afterStr release];
}
輸出結果:
//第四種 利用sortUsingDescriptors調用NSSortDescriptor
-(void) doTestSortUsingDescriptors
{
Person *person1 = [[Person alloc] init];
[person1 set_name:@"ABCD"];
[person1 set_age:24];
Person *person2 = [[Person alloc] init];
[person2 set_name:@"ACBA"];
[person2 set_age:22];
Person *person3 = [[Person alloc] init];
[person3 set_name:@"ABDC"];
[person3 set_age:33];
NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];
[person1 release];
[person2 release];
[person3 release];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"_name" ascending:YES];//YES降序,NO升序
//這個數組保存的是排序好的對象
NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
for (Person *ii in tempArray) {
NSLog(@"name:%@,age:%ld",ii._name,ii._age);
}
}
@end
輸出結果:
降序:ascending:YES
升序:ascending:NO
用數據結構排序算法對NSArray進行排序,項目代碼點擊鏈接下載:
http://download.csdn.net/detail/moqj_123/9252059