3 回答

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊
要對您的對象數(shù)組進(jìn)行排序:
setup
NSSortDescriptor
- 使用變量名作為設(shè)置描述符進(jìn)行排序的鍵以及要在這些鍵上執(zhí)行的選擇器使用
NSSortDescriptor
您設(shè)置的描述符數(shù)組根據(jù)這些描述符對數(shù)組進(jìn)行排序
這里有兩個例子,一個使用NSDictionary
和NSString/NSNumber
值排序NSNumber
,另一個使用自定義類,在兩個NSString
字段上排序。
在Cocoa編程主題中按照排序和過濾NSArray對象來查看更多示例和說明。
示例:
這是在GNUStep上完成的,它應(yīng)該在Cocoa上運行相同 - 代碼完全一樣 - 當(dāng)我坐在我的Mac前面時我會嘗試:
第一個示例使用NSString
和NSNumber
值對值進(jìn)行排序NSNumber
:
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];
使用帶有頻率字段的描述符對部件進(jìn)行排序,即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);
輸出 - 按頻率字段排序:
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; }
第二個示例使用自定義類并對兩個NSString
變量進(jìn)行排序。
要排序的數(shù)組(參見A
底部的類):
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]]];
排序部分,在lastName上排序,然后是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];
打印結(jié)果:
NSLog(@"\nSorted ...");enumerator = [sortedArray objectEnumerator];while ((obj = [enumerator nextObject])) NSLog(@"%@", obj);
結(jié)果(排序前后):
2009-12-04 00:52:16.637 x[11375] Alehandro, Xentro, age:402009-12-04 00:52:16.644 x[11375] John, Smith, age:302009-12-04 00:52:16.644 x[11375] John, Smyth, age:252009-12-04 00:52:16.644 x[11375] Torro, Ola, age:452009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:412009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:412009-12-04 00:52:16.645 x[11375]Sorted ...2009-12-04 00:52:16.645 x[11375] Alehandro, Axel, age:412009-12-04 00:52:16.645 x[11375] Alehandro, Bento, age:412009-12-04 00:52:16.645 x[11375] Torro, Ola, age:452009-12-04 00:52:16.645 x[11375] John, Smith, age:302009-12-04 00:52:16.645 x[11375] John, Smyth, age:252009-12-04 00:52:16.645 x[11375] Alehandro, Xentro, age:40
課程A
延伸NSObject
- 這里沒什么特別的:
#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
執(zhí)行:
#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

TA貢獻(xiàn)1818條經(jīng)驗 獲得超11個贊
“鍵”是對象的方法(數(shù)組“x”的元素),它返回要排序的對象。所以在這種情況下,你說你想按“頻率”排序。然后,您所要做的就是使用返回頻率的方法的名稱作為鍵。

TA貢獻(xiàn)1802條經(jīng)驗 獲得超4個贊
以下是對NSMutableArray進(jìn)行排序的方法:
NSMutableArray *numberSort =[[NSMutableArray alloc] init]; while ((key = [enumerator nextObject])) { //(NSNumber *)integer = [key integerValue]; [numberSort addObject:[NSNumber numberWithInt:[key intValue]]]; // code that uses the returned key } NSArray *stringSort = [numberSort sortedArrayUsingSelector:@selector(compare:)]; enumerator = [stringSort objectEnumerator]; NSNumber *intKey; NSMutableArray *backToString =[[NSMutableArray alloc] init]; while ((intKey = [enumerator nextObject])) { //(NSNumber *)integer = [key integerValue]; [backToString addObject:[intKey stringValue]]; // code that uses the returned key
- 3 回答
- 0 關(guān)注
- 823 瀏覽
添加回答
舉報