首页 > 代码库 > 数组排序

数组排序

 1 #pragma mark 冒泡排序 2 - (void)userArrSort:(NSMutableArray *)userArr 3 { 4     int n = userArr.count; 5     int i,j; 6     NSDictionary *temp; 7     for(j=0;j<n-1;j++) 8     { 9         for(i=0;i<n-1-j;i++)10         {11 //            NSDictionary*ssy = [];12             if(((NSString *)[userArr[i] objectForKey:@"vlevel"]).intValue<((NSString *)[userArr[i+1] objectForKey:@"vlevel"]).intValue)//数组元素大小按升序排列13             {14                 temp=userArr[i];15                 userArr[i]=userArr[i+1];16                 userArr[i+1]=temp;17             }18         }19     }20     for (int x = 0; x<userArr.count; x++)21     {22         if (1) {23 //            [userArr replaceObjectAtIndex:0 withObject:[userArr[i]];24         }25     }26 }27 #pragma mark 已排序数组插入一条数据28 - (void)insertObjectInUserArr:(NSMutableArray *)userArr withobject:(NSDictionary *)dic29 {30     int j;31     if(((NSString *)[dic objectForKey:@"vlevel"]).intValue<=((NSString *)[userArr[userArr.count - 1] objectForKey:@"vlevel"]).intValue)32     {33         [userArr insertObject:dic atIndex:userArr.count];34     }else35     {36         for(int i=0;i<userArr.count;i++)37         {38             if(((NSString *)[dic objectForKey:@"vlevel"]).intValue>((NSString *)[userArr[i] objectForKey:@"vlevel"]).intValue)39             {40                 j = i;41                 [userArr insertObject:dic atIndex:j];42                 break;43             }44         }45     }46 47 48 }

 

 

 

 

(1)直接调用系统的方法排序int

NSMutableArray*array = [[NSMutableArrayalloc]init];

[arrayaddObject:[NSNumbernumberWithInt:20]];

[arrayaddObject:[NSNumbernumberWithInt:1]];

[arrayaddObject:[NSNumbernumberWithInt:4]];

NSArray*sortedArray = [arraysortedArrayUsingSelector:@selector(compare:)];

for(inti =0; i < [sortedArraycount]; i++)

{

intx = [[sortedArrayobjectAtIndex:i]intValue];

NSLog(@"######%d\n", x);

}

 

(2)用descriptor方法

#import<Cocoa/Cocoa.h>

 

@interfaceNode: NSObject {

intx;

inty;

intv;

}

 

@property intx;

@property inty;

@property intv;

- (id)init:(int)tx y:(int)ty v:(int)tv;

@end

 

@implementationNode

 

@synthesizex;

@synthesizey;

@synthesizev;

 

- (id)init:(int)tx y:(int)ty v:(int)tv {

x= tx;

y= ty;

v= tv;

return self;

}

 

@end

 

intmain(intargc,char*argv[])

{

NSMutableArray *myMutableArray = [[NSMutableArrayalloc]init];

Node *n[2];

n[0] = [[Nodealloc]init:2y:1v:1];

n[1] = [[Nodealloc]init:4y:2v:2];

 

[myMutableArrayaddObject:n[0]];

[myMutableArrayaddObject:n[1]];

NSSortDescriptor* sortByA = [NSSortDescriptorsortDescriptorWithKey:@"x"ascending:NO];

[myMutableArraysortUsingDescriptors:[NSArrayarrayWithObject:sortByA]];

for(Node*tinmyMutableArray) {

NSLog(@"x === %d", t.x);

NSLog(@"y === %d", t.y);

NSLog(@"v === %d", t.v);

}

}

 

 

(3)自定义重写方法

/*

 

Abstract:Constants returned by comparison functions, indicating whether a value is equal to, less than, or greater than another value.

Declaration:enumCFComparisonResult{

kCFCompareLessThan= -1,

kCFCompareEqualTo= 0,

kCFCompareGreaterThan= 1

};

*/

#import<Cocoa/Cocoa.h>

@implementation NSNumber (MySort)

- (NSComparisonResult) myCompare:(NSString *)other {

//这里可以作适当的修正后再比较

int result = ([selfintValue]>>1) - ([other intValue]>>1);

//这里可以控制排序的顺序和逆序

return result < 0 ?NSOrderedDescending : result >0 ?NSOrderedAscending :NSOrderedSame;

}

 

@end

int main(int argc, char *argv[])

{

NSMutableArray *array = [[NSMutableArrayalloc]init];

[arrayaddObject:[NSNumbernumberWithInt:20]];

[arrayaddObject:[NSNumbernumberWithInt:1]];

[arrayaddObject:[NSNumbernumberWithInt:4]];

NSArray *sortedArray = [arraysortedArrayUsingSelector:@selector(myCompare:)];

for(int i = 0; i < [sortedArraycount]; i++)

{

int x = [[sortedArrayobjectAtIndex:i]intValue];

NSLog(@"######%d\n", x);

}

}

 

 

 

 

c语言实现的学生成绩管理系统是面向过程的,而OC实现的学生成绩管理系统则是面向对象的.

对该系统的重难点讲述如下:

1.排序.系统中的四个关键字分别是 stuID,姓名,年龄,成绩.我们可以选择这四种方式并选择 升降序的方法进行排序.

系统中使用的是  NSmutableArray 存储数据.那么如何对对象是类成员的数组排序呢?

先看看NSMutableArray排序的几种方式.

1)使用@Seletor选择器调用方法排序.

 

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. NSMutableArray *array = [[NSMutableArray alloc]init];  
  2.     [array addObject:[NSNumber numberWithInt:10]];  
  3.     [array addObject:[NSNumber numberWithInt:20]];  
  4.     [array addObject:[NSNumber numberWithInt:0]];  
  5.     [array addObject:[NSNumber numberWithInt:1]];  
  6.     [array addObject:[NSNumber numberWithInt:3]];  
  7.     NSLog(@"未排序的数组:%@",array);  
  8.       
  9.     NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];  
  10.      NSLog(@"yi排序的数组:%@",sortedArray);  
  11.     /* 
  12.      2013-11-29 08:28:00.616 OC实现学生成绩管理系统[451:303] 未排序的数组:( 
  13.      10, 
  14.      20, 
  15.      0, 
  16.      1, 
  17.      3 
  18.      ) 
  19.      2013-11-29 08:28:00.621 OC实现学生成绩管理系统[451:303] yi排序的数组:( 
  20.      0, 
  21.      1, 
  22.      3, 
  23.      10, 
  24.      20 
  25.      ) 
  26.      */  

 

 

同时也适用于类对象.

 

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //直接实现静态方法,获取带有name和age的Person对象  
  2. +(Person *)personWithAge:(int) age withName:(NSString *)name{  
  3.     Person *person = [[Person alloc] init];  
  4.     person.age = age;  
  5.     person.name = name;  
  6.     return person;  
  7. }  
  8.   
  9. //自定义排序方法  
  10. -(NSComparisonResult)comparePerson:(Person *)person{  
  11.   //默认按年龄排序  
  12.     NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本数据类型要进行数据转换  
  13.   //如果年龄一样,就按照名字排序  
  14.     if (result == NSOrderedSame) {  
  15.         result = [self.name compare:person.name];  
  16.     }  
  17.     return result;  
  18. }  



 


2.高级排序,使用排序描述器:使用descriptor方法对Array中成员是类对象的类型进行按@propery 列进行排序.

  

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. -(void)SortStudentArray//   
  2. {  
  3.     NSLog(@"按照学号排序请输入 (id)");  
  4.       
  5.     NSLog(@"按姓名排序请输入(name)");  
  6.       
  7.     NSLog(@"按照年龄排序请输入(age)");  
  8.       
  9.     NSLog(@"按照成绩排序(score)请输入:");  
  10.       
  11.     char charKey[10] ;  
  12.     scanf("%s",charKey);  
  13.       
  14.     NSString *tempkey = [NSString stringWithUTF8String:charKey];  
  15.     NSString *key = [tempkey lowercaseString];  
  16.       BOOL ascending = NO;  
  17.     NSLog(@"是否开启降序模式( 默认不开启 )?(yes or no):");  
  18.     char ascendingStr[10] ;  
  19.     scanf("%s",ascendingStr);  
  20.     NSString *ascendingKey =[[NSString stringWithUTF8String:ascendingStr] lowercaseString];  
  21.       
  22.     if ([ascendingKey isEqualToString:@"yes"])  
  23.         ascending = YES;  
  24.     else  
  25.         ascending = NO;  
  26.       
  27.       
  28.     if ([key isEqualToString:@"id"]) {  
  29.          
  30.         NSSortDescriptor *sortByID = [NSSortDescriptor sortDescriptorWithKey:@"stuID" ascending:ascending];  
  31.        // 建立NSSortDescriptor 对象,按照的属性列,是否是asc升序?  
[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByID]];  
  2.         //按照建立的descriptor进行排序.  
  3.     }  
  4.     else if([key isEqualToString:@"name"])  
  5.     {  
  6.         NSSortDescriptor *sortByName= [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:ascending];  
  7.           
  8.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByName]];  
  9.   
  10.       
  11.     }  
  12.     else if([ key isEqualToString:@"age"])  
  13.     {  
  14.         NSSortDescriptor *sortByAge = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:ascending];  
  15.           
  16.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByAge]];  
  17.   
  18.       
  19.     }  
  20.     else if ([key isEqualToString:@"score"])  
  21.     {  
  22.         NSSortDescriptor *sortByScore = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:ascending];  
  23.           
  24.         [studentArray sortUsingDescriptors:[NSArray arrayWithObject:sortByScore]];  
  25.   
  26.       
  27.     }  
  28.   
  29.   
  30. }  

上述代码就是我在管理系统中实现的,结果将在系统中呈现.

 

3.自定义重写方法进行排序.使用Block进行排序.

 

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. NSArray *array = [NSArray arrayWithObjects:@"1bc",@"4b6",@"123",@"789",@"3ef", nil nil];  
  2.        NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {  
  3.              
  4.            //这里的代码可以参照上面compare:默认的排序方法,也可以把自定义的方法写在这里,给对象排序  
  5.            NSComparisonResult result = [obj1 compare:obj2];  
  6.            return result;  
  7.        }];  
  8.        NSLog(@"排序后:%@",sortedArray);  

 

 

2013-11-29 08:42:56.723 OC实现学生成绩管理系统[483:303] 排序后:(

    123,

    1bc,

    3ef,

    4b6,

    789

)