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);

时间: 2024-08-29 00:10:14

ios 排序汇总的相关文章

iOS 网络资源汇总

下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 具体内容 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看"使用方法". (国人写) XHRefresh

IOS问题汇总:2015-1-9 IOS之NSArray 中调用的方法详解(转)

IOS之NSArray 中调用的方法详解 下面的例子以 NSArray *array = [NSArray arrayWithObjects:@“wendy”,@“andy”,@“tom”,@“jonery”,@“stany”, nil];1.获取数组中总共有多少个对象. -(NSUInteger)count; NSLog(@“%d”,[array count]); 2 2.获取数组中下标对应的元素对象.(下标是从0开始) -(id)objectAtIndex:(NSUInteger)index

GridControl详解(四)分组排序汇总

分组: 按时间分第一组: 按性别分第二组: 显示结果: 高级设置: 将所有组展开代码:gridView1.ExpandAllGroups(); 显示结果: 自定义组名,GridView级事件 增加事件: private void gridView1_CustomDrawGroupRow(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e) { GridGroupRowInfo GridGroup

基数排序-八大排序汇总(8)

基数排序的性能 排序类别 排序方法 时间复杂度 空间复杂度 稳定性 复杂性 平均情况 最坏情况 最好情况 基数排序 基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)) O(n+r) 稳定 较复杂 时间复杂度:假设在基数排序中,r为基数,d为位数.则基数排序的时间复杂度为O(d(n+r)).可以看出,基数排序的效率和初始序列是否有序没有关联. 空间复杂度:基数排序过程中,对于任何位数上的基数进行“装桶”操作时,都需要n+r个临时空间. 算法稳定性:基数排序过程中,每次都是将当前位

排序汇总

排序算法即是一种能将一串数据依照特定排序方式进行排列的一种算法.本文将简单介绍几种常用的排序算法,并给出源代码,仅供参考. 1.直接插入排序:是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 2.希尔排序:是插入排序的一种.也称缩小增量排序,是直接插入排序

IOS问题汇总:2015-1-9 【iOS开发】.h,.m,.mm,.cpp等区别

[iOS开发].h,.m,.mm,.cpp等区别 文件区别: .h :头文件.头文件包含类,类型,函数和常数的声明. .m :源代码文件.这是典型的源代码文件扩展名,可以包含Objective-C和C代码. .mm :源代码文件.带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码.仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名 .cpp:只能编译C++ 当你需要在源代码中包含头文件的时候,你可以使用标准的#incl

IOS问题汇总:2015-1-8 SBJson解析时报错—json文件字符非法

SBJson解析时报错—json文件字符非法 Error Domain=org.brautaset.SBJsonParser.ErrorDomain Code=0 “Illegal start of token [ï]” UserInfo=0x7fd46ad98590 {NSLocalizedDescription=Illegal start of token [ï]} IOS应用在iPhone5和iPhone5s上不能全屏显示,应用画面上下各有1条黑色的解决方案——是因为LaunchScree

内部排序汇总

一. 插入排序 1. 直接插入排序 /* 直接插入排序 */ void insertSort(int a[], int n) { int i,j; for (i=2;i<=n;i++) // 依次将a[i]插入到前面已排序序列 { if (a[i]<a[i-1]) // 若a[i]小于其前驱,才需将a[i]插入有序表 { a[0]=a[i]; // 复制为哨兵 for (j=i-1;a[0]<a[j];--j) // 从后往前查找插入位置 { a[j+1]=a[j]; // 向后挪位 }

IOS问题汇总:2015-1-9 iOS 调用系统发短信以及打电话功能

iOS 调用系统发短信以及打电话功能 ios电话smsinterface互联网class先介绍一种最简单的方法: 调用打电话功能 [[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@“tel://10086”]]; 调用发短信功能 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@“sms://10000”]]; 上面的发短信的功能是调用系统的