如何使用 sortedArrayUsingDescriptors 对 NSMutableArray 进行排序? [英] How to sort NSMutableArray using sortedArrayUsingDescriptors?

查看:41
本文介绍了如何使用 sortedArrayUsingDescriptors 对 NSMutableArray 进行排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个关于排序 NSMutableArray 的问题.我可以使用 sortedArrayUsingDescriptors: 方法对包含对象的数组进行排序.

I have a question about sorting NSMutableArray. I can use sortedArrayUsingDescriptors: method to sort an array with objects.

例如,我有一个 placesNSMutableArray,其中我有一个属性 frequency(int 值),我想对 frequency 进行降序排序code>frequency 但我不知道如何正确使用它.

For example I have an NSMutableArray of places where I have an attribute frequency (int value) and I want to sort descending on frequency but I don't know how to use it correctly.

我在 initWithKey 中放什么作为键?

What do I put as a key in initWithKey?

我的对象 place 包含:

NSString * name;
NSString * address;
NSString * frequency;
NSString * type;

<小时>

NSMutableArray * places;

... populate array with objects ...

NSSortDescriptor * sortByFrequency =
   [[[NSSortDescriptor alloc] initWithKey:@"????????" ascending:NO] autorelease];

NSArray * descriptors = [NSArray arrayWithObject:sortByFrequency];
NSArray * sorted = [x sortedArrayUsingDescriptors:descriptors];

推荐答案

要对对象数组进行排序,您:

To sort your array of objects you:

  1. setup NSSortDescriptor - 使用变量名称作为键来设置排序描述符以及要在这些键上执行的选择器
  2. 使用您设置的 NSSortDescriptor 获取描述符数组
  3. 根据这些描述符对数组进行排序
  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

这里有两个例子,一个使用 NSDictionaryNSString/NSNumber 值在 NSNumber 上排序,另一个使用自定义类和排序两个 NSString 字段.

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

遵循排序和过滤 NSArray 对象 在 Cocoa 编程主题中查看更多示例和解释.

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

示例:

这是在 GNUStep 上完成的,它在 Cocoa 上应该也能工作——代码完全一样——我坐在 Mac 前试试:

第一个使用 NSStringNSNumber 值并对 NSNumber 值进行排序的示例:

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

<小时>

使用带有NSNumber的Frequency字段的描述符对部分进行排序:


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(@"
Sorted ...");

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 变量进行排序.



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

要排序的数组(请参阅底部的 A 类):

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(@"
Sorted ...");

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 扩展 NSObject - 这里没什么特别的:

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

实施:

#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

这篇关于如何使用 sortedArrayUsingDescriptors 对 NSMutableArray 进行排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆