To sort your array of objects you:
- setup
NSSortDescriptor
- use names of your variables as keys to setup descriptor for sorting plus the selector to be executed on those keys
- get the array of descriptors using
NSSortDescriptor
that you've setup
- 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];
}
相关推荐
本篇文章将深入探讨`NSArray`的排序方法,并通过一个名为"NSArrayDemo"的示例来演示如何对数组进行排序。 首先,我们要明白`NSArray`本身不支持直接的排序操作,因为它是不可变的,也就是说一旦创建,其内部对象的...
1. NSArray排序:由于NSArray本身不支持排序,如果需要对NSArray进行排序,通常会先将其转换为可变数组NSMutableArray,进行排序后再转回NSArray。 2. NSMutableArray排序:提供了`sortUsingComparator:`和`...
1. 扩展系统类的功能,如上述的NSArray排序方法。 2. 给私有分类添加辅助方法,以提高代码组织的清晰度。 3. 在没有权限修改源码的第三方库中添加功能或修复问题。 4. 实现一些常用的工具方法,如字符串转日期、颜色...
1. **NSArray排序1**: 使用`sortedArrayUsingSelector:`方法,传入`compare:`作为参数。这个方法会根据对象的内置比较机制对数组进行排序。在我们的例子中,数组元素是字符串,所以`compare:`方法会按照字典顺序对...
//取第一页,每页10条按条件查询数据,指定字段,设置分页,设置排序,返回结果为NSArray 排序中 desc 代表 降序,asc代表升序 单个字段排序 如 id desc 多个字段排序 如 id,wheel ascNSString *where = @"name='...
然而,现代编程语言和框架通常提供内置的排序功能,例如Objective-C的`NSArray`有一个`sortedArrayUsingComparator:`方法,可以方便地对数组进行排序,包括`NSDate`对象。这种方法通常比自定义实现的冒泡排序更高效...
除了基本的数组排序,iOS开发者还需要了解各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法在特定情况下可能会影响应用的性能。例如,快速排序通常比冒泡排序更快,但在处理小规模...
在Objective-C中,我们可以使用`NSArray`的`sortedArrayUsingComparator:`方法,传入一个比较Block来实现字典的排序。以下是一个按照键排序的例子: ```objc NSDictionary *unsortedDict = @{@"C": @3, @"A": @1...
总的来说,NSArray和NSMutableArray提供了丰富的操作方法,如添加、删除、查询、排序等,使得在iOS开发中处理数据变得简单。在选择使用哪种类型时,主要考虑数组是否需要在程序运行过程中被修改。如果不需要修改,应...
`sortedArrayUsingComparator`是Objective-C中`NSArray`类的一个方法,用于对数组中的对象进行自定义排序。这个方法非常强大,因为它允许我们根据自定义的比较规则来对数组元素进行排序。 首先,我们要理解`...
- (NSInteger)binarySearch:(NSArray *)sortedArray target:(id)target { NSInteger low = 0; NSInteger high = sortedArray.count - 1; while (low ) { NSInteger mid = (low + high) / 2; id midValue = ...
Objective-C提供了`NSArray`的`sortedArrayUsingComparator:`方法,它允许我们传递一个比较器Block来定义排序规则。例如,如果你有一个包含自定义对象(如`Person`)的数组,你可以按照年龄进行排序: ```objc ...
接下来,`NSArray+SortedChinAndEng.h`和`NSArray+SortedChinAndEng.m`则表明对`NSArray`进行了分类扩展,增加了处理中文和英文排序的方法。在Objective-C中,我们可以使用类别(Category)为已有的类添加新的方法。...
在Objective-C中,我们可以使用`NSArray`类的`sortedArrayUsingComparator:`方法来对数组进行自定义排序。这个方法接受一个比较器 block,其中我们可以指定如何比较数组中的元素。对于字符串,我们可以基于Unicode值...
在Objective-C中,排序通常涉及到`NSArray`或`NSMutableArray`对象,因为它们提供了对元素的存储和操作。数组对象可以包含各种类型的对象,包括数字(整型或浮点型)、字符串和自定义对象。 对于数字的排序,...
4. **排序实现**:可以使用`NSArray`的`sortedArrayUsingComparator:`方法,传入一个比较器闭包。比较器中,根据两个拼音字符串的字典顺序进行比较,从而确定原数组中对应汉字的顺序。 5. **特殊字符处理**:对于非...
假设解析出来的数据是`NSArray`,其中包含一系列`NSDictionary`对象,你可以依据特定键(key)对这些字典进行排序。例如,如果每个字典都有一个名为"score"的键,你可以使用`sortedArrayUsingComparator:`方法,...
`NSArray`是不可变的,一旦创建就不能修改,而`NSMutableArray`则支持添加、删除和替换元素等操作,因此更适合需要排序的情况。 创建一个`NSArray`的基本语法如下: ```objc NSArray *myArray = @[@"Element1", @...
这通常意味着我们需要有一个存储应用图标位置的数据结构,如NSArray或NSMutableArray。每次视图位置改变时,我们都需要更新对应数据模型中的顺序,确保视图和模型的一致性。这样,在应用重新启动或者数据刷新时,...