zoukankan      html  css  js  c++  java
  • ios 排序汇总

    ios 排序汇总 

    IOS几种简单有效的数组排序方法


    //第一种,利用数组的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; 
    }; 
    NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil]; 
     //排序前 
     NSMutableString *outputBefore = [[NSMutableString alloc] init]; 
     for(NSString *str in sortArray){ 
      [outputBefore appendFormat:@"]; 
     } 
     NSLog(@"排序前:%@",outputBefore); 
     [outputBefore release]; 
     //第一种排序 
     NSArray *array = [sortArray sortedArrayUsingComparator:cmptr]; 
      
     NSMutableString *outputAfter = [[NSMutableString alloc] init]; 
     for(NSString *str in array){ 
      [outputAfter appendFormat:@"]; 
     } 
     NSLog(@"排序后:%@",outputAfter); 
     [outputAfter release]; 

    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;
    };
    NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
     //排序前
     NSMutableString *outputBefore = [[NSMutableString alloc] init];
     for(NSString *str in sortArray){
      [outputBefore appendFormat:@"];
     }
     NSLog(@"排序前:%@",outputBefore);
     [outputBefore release];
     //第一种排序
     NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
     
     NSMutableString *outputAfter = [[NSMutableString alloc] init];
     for(NSString *str in array){
      [outputAfter appendFormat:@"];
     }
     NSLog(@"排序后:%@",outputAfter);
     [outputAfter release];

     

    第二种 排序方法 利用sortedArrayUsingFunction 调用 对应方法customSort,这个方法中的obj1和obj2分别是指数组中的对象。


    [plain]
    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; 

     NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil]; 
     //排序前 
     NSMutableString *outputBefore = [[NSMutableString alloc] init]; 
     for(NSString *str in sortArray){ 
      [outputBefore appendFormat:@"]; 
     } 
     NSLog(@"排序前:%@",outputBefore); 
     [outputBefore release]; 
      
     NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil]; 
      
     NSMutableString *outputAfter = [[NSMutableString alloc] init]; 
     for(NSString *str in array){ 
      [outputAfter appendFormat:@"]; 
     } 
     NSLog(@"排序后:%@",outputAfter); 
     [outputAfter release]; 

    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;
    }
     NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
     //排序前
     NSMutableString *outputBefore = [[NSMutableString alloc] init];
     for(NSString *str in sortArray){
      [outputBefore appendFormat:@"];
     }
     NSLog(@"排序前:%@",outputBefore);
     [outputBefore release];
     
     NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
     
     NSMutableString *outputAfter = [[NSMutableString alloc] init];
     for(NSString *str in array){
      [outputAfter appendFormat:@"];
     }
     NSLog(@"排序后:%@",outputAfter);
     [outputAfter release];

     

    第三种 利用sortUsingDescriptors调用NSSortDescriptor

     

    [plain]
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];//其中,price为数组中的对象的属性,这个针对数组中存放对象比较更简洁方便 
      NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; 
      [_totalInfoArray sortUsingDescriptors:sortDescriptors]; 
      [_airListView refreshTable:_totalInfoArray]; 
      [sortDescriptor release]; 
      [sortDescriptors release]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];//其中,price为数组中的对象的属性,这个针对数组中存放对象比较更简洁方便
      NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1];
      [_totalInfoArray sortUsingDescriptors:sortDescriptors];
      [_airListView refreshTable:_totalInfoArray];
      [sortDescriptor release];
      [sortDescriptors release];


    20120619更新


    排序操作,NSArray提供了很多种方法,按照所利用的排序参数,可以简单分为descriptor,selector,function,和block排序。
    数组排序的时候有sortedArrayUsingComparator方法,这里的参数为NSComparator,这个类其实是Block所定义的
    typedef NSComparisonResult (^NSComparator)(id obj1,id obj2);
    所以我们直接用NSComparator myComparator=^(id obj1,id obj2){};
    Block其实可以看作JS里面的(){}();方法以及.Net中的匿名方法,即不需要声明就直接使用的方法,主要用处包括回调、事件处理和排序。声明和实现可以分开,也可以写在一起:
    [plain] view plaincopyprint?NSInteger (^blockExample)(int,NSString*)=^(int i,NSString *s) 

           NSLog(@"%d,%@",i,s); 
    }; 
    blockExample(42,@"hello"); 

    NSInteger (^blockExample)(int,NSString*)=^(int i,NSString *s)
    {
           NSLog(@"%d,%@",i,s);
    };
    blockExample(42,@"hello");
    对于NSArray排序或者其他需要Block作为参数的函数来说,可以写成下面两种形式:
    //声明和使用


    [plain]
    NSComparison ( ^ageComparator )( id, id ) = ^( id o1, id o2 ) { 
        // 比较函数的实现 
    }; 
        NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:ageComparator]; 
    // 不声明,彻底匿名使用 
        NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:^( id o1, id o2 ) { //... 
        }]; 

    NSComparison ( ^ageComparator )( id, id ) = ^( id o1, id o2 ) {
        // 比较函数的实现
    };
        NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:ageComparator];
    // 不声明,彻底匿名使用
        NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:^( id o1, id o2 ) { //...
        }];

     

    例子:

    [plain]
    NSArray    *array = [NSArray arrayWithObjects:@"71", @"16", @"51", @"104", @"13",@"2",@"1", nil]; 
     
     
        array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) { 
            return (arc4random() % 3) - 1; 
        }]; 
     
     
       // NSLog(@"array:%@", array); 
     
     
        NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {  
     
     
            if ([obj1 integerValue] > [obj2 integerValue]) {  
                return (NSComparisonResult)NSOrderedAscending;  
            }  
     
     
            if ([obj1 integerValue] < [obj2 integerValue]) {  
                return (NSComparisonResult)NSOrderedDescending;  
            }  
            return (NSComparisonResult)NSOrderedSame;  
     
     
        }];  
     
     
     
     
    sortedArray 是排好序的时间对象数组 
     
     
        // 按时间排序 
     
     
        NSArray *sortedArray = [srcArrary sortedArrayUsingComparator:^(id obj1, id obj2) 
     
     
                                { 
     
     
                                    NSComparisonResult result = [obj1 compare:obj2]; 
     
     
                                    switch(result) 
                                    { 
                                        case NSOrderedAscending: 
                                            return NSOrderedDescending;             
                                        case NSOrderedDescending: 
                                            return NSOrderedAscending; 
                                        case NSOrderedSame: 
                                            return NSOrderedSame; 
                                        default: 
                                            return NSOrderedSame;   
                                    } // 时间从近到远(远近相对当前时间而言) 
     
     
                                }]; 

     NSArray    *array = [NSArray arrayWithObjects:@"71", @"16", @"51", @"104", @"13",@"2",@"1", nil];


        array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {
            return (arc4random() % 3) - 1;
        }];


       // NSLog(@"array:%@", array);


        NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {


            if ([obj1 integerValue] > [obj2 integerValue]) {
                return (NSComparisonResult)NSOrderedAscending;
            }


            if ([obj1 integerValue] < [obj2 integerValue]) {
                return (NSComparisonResult)NSOrderedDescending;
            }
            return (NSComparisonResult)NSOrderedSame;


        }];

     


    sortedArray 是排好序的时间对象数组


        // 按时间排序


        NSArray *sortedArray = [srcArrary sortedArrayUsingComparator:^(id obj1, id obj2)


                                {


                                    NSComparisonResult result = [obj1 compare:obj2];


                                    switch(result)
                                    {
                                        case NSOrderedAscending:
                                            return NSOrderedDescending;           
                                        case NSOrderedDescending:
                                            return NSOrderedAscending;
                                        case NSOrderedSame:
                                            return NSOrderedSame;
                                        default:
                                            return NSOrderedSame; 
                                    } // 时间从近到远(远近相对当前时间而言)


                                }];

    //随机排序


    [plain]
    NSArray    *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil]; 
        array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) { 
            return (arc4random() % 3) - 1; 
        }]; 
        NSLog(@"array:%@", array); 

    NSArray    *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
        array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {
            return (arc4random() % 3) - 1;
        }];
        NSLog(@"array:%@", array);

  • 相关阅读:
    Python安装(小白教程)中文版Pycharm
    二叉树遍历1
    node* p 和 node *p 和 node * p 的区别
    WinForm中的ListBox组件编程
    C# winform listBox中的项上下移动(转)
    C# ListBox 左移、右移、上移、下移
    C#上移,下移TreeView中的树节点顺序
    C#遍历DataSet与DataSet元素实现代码
    C# 手动编写 DataSet,DataTable 及遍历DataSet中的数据
    【.NET】C#中遍历各类数据集合的方法
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/4110251.html
Copyright © 2011-2022 走看看