zoukankan      html  css  js  c++  java
  • 数组排序

     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 *)dic
    29 {
    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     }else
    35     {
    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 ", 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 ", x);

    }

    }

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

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

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

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

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

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

    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.      */  

    同时也适用于类对象.

    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 列进行排序.

      

    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升序?  
    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进行排序.

    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

    )

  • 相关阅读:
    单例模式
    属性和方法的调用
    整型数从最小到最大取值,二进制变动机制
    java数据类型
    插入字符,数组顺序不变
    运算符“/”
    CentOS7 防火墙(firewall)的操作命令(转)
    面试题4(剑指)-螺旋打印矩阵
    面试题3(剑指)-重建二叉树
    面试题2——遍历二叉树
  • 原文地址:https://www.cnblogs.com/yunis/p/3884446.html
Copyright © 2011-2022 走看看