`
zani
  • 浏览: 356459 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

NSArray排序

 
阅读更多

 [dataArray sortedArrayUsingFunction: sortDataArrayByModifyFileDate context:NULL];

NSInteger sortDataArrayByModifyFileDate(id obj1, id obj2, void *context)
{
	NSString* str1 = (NSString*)obj1;
	NSString* str2 = (NSString*)obj2;
	
	NSString* dateString1 = [[str1 componentsSeparatedByString:@"$"] objectAtIndex:2];
	NSString* dateString2 = [[str2 componentsSeparatedByString:@"$"] objectAtIndex:2];
	DLog(@">>>>>str1:%@", dateString1);
	DLog(@">>>>str2:%@", dateString2);
	
 
	
	return ([dateString2 compare:dateString1]);
}

 

 

To sort your array of objects you:

  1. setup NSSortDescriptor - use names of your variables as keys to setup descriptor for sorting plus the selector to be executed on those keys
  2. get the array of descriptors using NSSortDescriptor that you've setup
  3. sort your array based on those descriptors

Here are two examples, one using NSDictionary and NSString/NSNumber values sorting onNSNumber, the other one using custom class with sorting on two NSString fields.

Follow Sorting and Filtering NSArray Objects in Cocoa programming topics to see more examples and explanation.

Example:

This was done on GNUStep it should work the same on Cocoa - the code is exactly the same - I'll try when I sit in front of my Mac:

First example using NSString and NSNumber values with sorting on NSNumber value:

NSString * NAME      = @"name";
NSString * ADDRESS   = @"address";
NSString * FREQUENCY = @"frequency";
NSString * TYPE      = @"type";

NSMutableArray * array = [NSMutableArray array];

NSDictionary * dict;

dict = [NSDictionary dictionaryWithObjectsAndKeys:
            @"Alehandro", NAME, @"Sydney", ADDRESS,
            [NSNumber numberWithInt:100], FREQUENCY,
            @"T", TYPE, nil];
[array addObject:dict];

dict = [NSDictionary dictionaryWithObjectsAndKeys:
            @"Xentro", NAME, @"Melbourne", ADDRESS,
            [NSNumber numberWithInt:50], FREQUENCY,
            @"X", TYPE, nil];
[array addObject:dict];

dict = [NSDictionary dictionaryWithObjectsAndKeys:
            @"John", NAME, @"Perth", ADDRESS,
            [NSNumber numberWithInt:75],
            FREQUENCY, @"A", TYPE, nil];
[array addObject:dict];

dict = [NSDictionary dictionaryWithObjectsAndKeys:
            @"Fjord", NAME, @"Brisbane", ADDRESS,
            [NSNumber numberWithInt:20], FREQUENCY,
            @"B", TYPE, nil];
[array addObject:dict];

Sorting part using descriptors with the Frequency field which is NSNumber:

NSSortDescriptor * frequencyDescriptor =
    [[[NSSortDescriptor alloc] initWithKey:FREQUENCY
                                 ascending:YES] autorelease];

id obj;
NSEnumerator * enumerator = [array objectEnumerator];
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

NSArray * descriptors =
    [NSArray arrayWithObjects:frequencyDescriptor, nil];
NSArray * sortedArray =
    [array sortedArrayUsingDescriptors:descriptors];

NSLog(@"\nSorted ...");

enumerator = [sortedArray objectEnumerator];
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

OUTPUT - sorted by Frequency field:

2009-12-04 x[1] {address = Sydney; frequency = 100; name = Alehandro; type = T; }
2009-12-04 x[1] {address = Melbourne; frequency = 50; name = Xentro; type = X; }
2009-12-04 x[1] {address = Perth; frequency = 75; name = John; type = A; }
2009-12-04 x[1] {address = Brisbane; frequency = 20; name = Fjord; type = B; }
2009-12-04 x[1]
Sorted ...
2009-12-04 x[1] {address = Brisbane; frequency = 20; name = Fjord; type = B; }
2009-12-04 x[1] {address = Melbourne; frequency = 50; name = Xentro; type = X; }
2009-12-04 x[1] {address = Perth; frequency = 75; name = John; type = A; }
2009-12-04 x[1] {address = Sydney; frequency = 100; name = Alehandro; type = T; }


Second example with custom class and sorting on two NSString variables.

Array to sort (see class A at the bottom):

NSMutableArray * array = [NSMutableArray array];
[array addObject:[[A alloc] initWithFirstName:@"Alehandro"
                                     lastName:@"Xentro"
                                          age:[NSNumber numberWithInt:40]]];
[array addObject:[[A alloc] initWithFirstName:@"John"
                                     lastName:@"Smith"
                                          age:[NSNumber numberWithInt:30]]];
[array addObject:[[A alloc] initWithFirstName:@"John"
                                     lastName:@"Smyth"
                                          age:[NSNumber numberWithInt:25]]];
[array addObject:[[A alloc] initWithFirstName:@"Torro"
                                     lastName:@"Ola"
                                          age:[NSNumber numberWithInt:45]]];
[array addObject:[[A alloc] initWithFirstName:@"Alehandro"
                                     lastName:@"Bento"
                                          age:[NSNumber numberWithInt:41]]];
[array addObject:[[A alloc] initWithFirstName:@"Alehandro"
                                     lastName:@"Axel"
                                          age:[NSNumber numberWithInt:41]]];

The sorting part, sort on lastName then firstName:

NSString * LASTNAME = @"lastName";
NSString * FIRSTNAME = @"firstName";

NSSortDescriptor *lastDescriptor =
    [[[NSSortDescriptor alloc]
        initWithKey:LASTNAME
          ascending:YES
           selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];

NSSortDescriptor *firstDescriptor =
    [[[NSSortDescriptor alloc]
        initWithKey:FIRSTNAME
          ascending:YES
           selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];

NSArray * descriptors =
   [NSArray arrayWithObjects:lastDescriptor, firstDescriptor, nil];
NSArray * sortedArray =
   [array sortedArrayUsingDescriptors:descriptors];

Print the result:

NSLog(@"\nSorted ...");

enumerator = [sortedArray objectEnumerator];
while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);

Result (before and after sorting):

2009-12-04 00:52:16.637 x[11375] Alehandro, Xentro, age:40
2009-12-04 00:52:16.644 x[11375] John, Smith, age:30
2009-12-04 00:52:16.644 x[11375] John, Smyth, age:25
2009-12-04 00:52:16.644 x[11375] Torro, Ola, age:45
2009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:41
2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:41
2009-12-04 00:52:16.645 x[11375]
Sorted ...
2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:41
2009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:41
2009-12-04 00:52:16.645 x[11375] Torro, Ola, age:45
2009-12-04 00:52:16.645 x[11375] John, Smith, age:30
2009-12-04 00:52:16.645 x[11375] John, Smyth, age:25
2009-12-04 00:52:16.645 x[11375] Alehandro, Xentro, age:40

Class A extends NSObject - nothing special here:

#import <Foundation/Foundation.h>

@interface A : NSObject
{
    NSString * firstName;
    NSString * lastName;
    NSNumber * age;
}

- (id)initWithFirstName:(NSString*)aFirstName
               lastName:(NSString*)aLastName
                    age:(NSNumber*)anAge;

-(NSString* )description;
+(NSString*)action;

@end

Implementation:

#import <Foundation/Foundation.h>
#import "A.h"

@implementation A

- (id)init
{
    return [self initWithFirstName:@"N/A"
                          lastName:@"N/A"
                               age:0];
}

- (id)initWithFirstName:(NSString*)aFirstName
               lastName:(NSString*)aLastName
                    age:(NSNumber*)anAge
{
    self = [super init];
    if (!self) return nil;

    firstName = [aFirstName copy];
    lastName = [aLastName copy];
    age = [anAge copy];

    return self;
}

- (void)dealloc
{
    [firstName release];
    [lastName release];
    [age release];
    [super release];
}

- (NSString *) description
{
    return [NSString stringWithFormat: @"%@, %@, age:%@",
                                       firstName, lastName, age];
}

@end 

分享到:
评论

相关推荐

    NSArray排序demo

    本篇文章将深入探讨`NSArray`的排序方法,并通过一个名为"NSArrayDemo"的示例来演示如何对数组进行排序。 首先,我们要明白`NSArray`本身不支持直接的排序操作,因为它是不可变的,也就是说一旦创建,其内部对象的...

    oc中数组排序

    1. NSArray排序:由于NSArray本身不支持排序,如果需要对NSArray进行排序,通常会先将其转换为可变数组NSMutableArray,进行排序后再转回NSArray。 2. NSMutableArray排序:提供了`sortUsingComparator:`和`...

    ios-iOS类目常用类目.zip

    1. 扩展系统类的功能,如上述的NSArray排序方法。 2. 给私有分类添加辅助方法,以提高代码组织的清晰度。 3. 在没有权限修改源码的第三方库中添加功能或修复问题。 4. 实现一些常用的工具方法,如字符串转日期、颜色...

    Objective-C中NSArray的基本用法示例

    1. **NSArray排序1**: 使用`sortedArrayUsingSelector:`方法,传入`compare:`作为参数。这个方法会根据对象的内置比较机制对数组进行排序。在我们的例子中,数组元素是字符串,所以`compare:`方法会按照字典顺序对...

    基于FMDB数据库操作类PYFMDB.zip

    //取第一页,每页10条按条件查询数据,指定字段,设置分页,设置排序,返回结果为NSArray 排序中 desc 代表 降序,asc代表升序 单个字段排序 如 id desc 多个字段排序 如 id,wheel ascNSString *where = @"name='...

    冒泡排序-时间排序

    然而,现代编程语言和框架通常提供内置的排序功能,例如Objective-C的`NSArray`有一个`sortedArrayUsingComparator:`方法,可以方便地对数组进行排序,包括`NSDate`对象。这种方法通常比自定义实现的冒泡排序更高效...

    ios-排序.zip

    除了基本的数组排序,iOS开发者还需要了解各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法在特定情况下可能会影响应用的性能。例如,快速排序通常比冒泡排序更快,但在处理小规模...

    iOS中对字典进行排序

    在Objective-C中,我们可以使用`NSArray`的`sortedArrayUsingComparator:`方法,传入一个比较Block来实现字典的排序。以下是一个按照键排序的例子: ```objc NSDictionary *unsortedDict = @{@"C": @3, @"A": @1...

    Iphone数组一些基础操作 NSArray/NSMutableArray

    总的来说,NSArray和NSMutableArray提供了丰富的操作方法,如添加、删除、查询、排序等,使得在iOS开发中处理数据变得简单。在选择使用哪种类型时,主要考虑数组是否需要在程序运行过程中被修改。如果不需要修改,应...

    iOS模型数组排序

    `sortedArrayUsingComparator`是Objective-C中`NSArray`类的一个方法,用于对数组中的对象进行自定义排序。这个方法非常强大,因为它允许我们根据自定义的比较规则来对数组元素进行排序。 首先,我们要理解`...

    对半查找,选择排序,冒泡排序和快速排序的Objective-C实现

    - (NSInteger)binarySearch:(NSArray *)sortedArray target:(id)target { NSInteger low = 0; NSInteger high = sortedArray.count - 1; while (low ) { NSInteger mid = (low + high) / 2; id midValue = ...

    ios开发多种排序法

    Objective-C提供了`NSArray`的`sortedArrayUsingComparator:`方法,它允许我们传递一个比较器Block来定义排序规则。例如,如果你有一个包含自定义对象(如`Person`)的数组,你可以按照年龄进行排序: ```objc ...

    iOSSorted排序

    接下来,`NSArray+SortedChinAndEng.h`和`NSArray+SortedChinAndEng.m`则表明对`NSArray`进行了分类扩展,增加了处理中文和英文排序的方法。在Objective-C中,我们可以使用类别(Category)为已有的类添加新的方法。...

    IOS根据汉字(或英文)按字母排序并按首字母分组

    在Objective-C中,我们可以使用`NSArray`类的`sortedArrayUsingComparator:`方法来对数组进行自定义排序。这个方法接受一个比较器 block,其中我们可以指定如何比较数组中的元素。对于字符串,我们可以基于Unicode值...

    Objective—C中的排序

    在Objective-C中,排序通常涉及到`NSArray`或`NSMutableArray`对象,因为它们提供了对元素的存储和操作。数组对象可以包含各种类型的对象,包括数字(整型或浮点型)、字符串和自定义对象。 对于数字的排序,...

    iOS 中文排序所需头文件

    4. **排序实现**:可以使用`NSArray`的`sortedArrayUsingComparator:`方法,传入一个比较器闭包。比较器中,根据两个拼音字符串的字典顺序进行比较,从而确定原数组中对应汉字的顺序。 5. **特殊字符处理**:对于非...

    plist文件排序输出

    假设解析出来的数据是`NSArray`,其中包含一系列`NSDictionary`对象,你可以依据特定键(key)对这些字典进行排序。例如,如果每个字典都有一个名为"score"的键,你可以使用`sortedArrayUsingComparator:`方法,...

    oc数组排序

    `NSArray`是不可变的,一旦创建就不能修改,而`NSMutableArray`则支持添加、删除和替换元素等操作,因此更适合需要排序的情况。 创建一个`NSArray`的基本语法如下: ```objc NSArray *myArray = @[@"Element1", @...

    非常棒的模块拖动 移动 app管理 排序

    这通常意味着我们需要有一个存储应用图标位置的数据结构,如NSArray或NSMutableArray。每次视图位置改变时,我们都需要更新对应数据模型中的顺序,确保视图和模型的一致性。这样,在应用重新启动或者数据刷新时,...

Global site tag (gtag.js) - Google Analytics