3

我在 NSArray 中有一个 NSString,我想根据它的重要性来排序这个字符串/字段。所以说字符串是B,H,A,Q,Z,L,M,O。

我希望它始终按 A、Q、Z、B、H、O、L、M 排序。这是一组预定义的规则。我该怎么做呢?这可以使用 NSSortDescriptor 完成吗?

4

2 回答 2

2

简短的回答: 是的!

这就是如何...

由于您需要了解有关您的值的两条信息(重要性和值本身),因此您应该使用这两条重要信息创建一个对象,然后将其存储在一个类似于存储字符串的方式的数组中。如果您想在一段时间后轻松更改“重要性”,这将变得很简单:

@interface MyObject : NSObject
@property (nonatomic, readwrite) NSInteger sortOrder;
@property (nonatomic, retain) NSString *value;
@end

@implementation MyObject
@synthesize sortOrder;
@synthesize value;
-(NSString *)description
{
   //...so I can see the values in console should I NSLog() it
   return [NSString stringWithFormat:@"sortOrder=%i, value=%@", self.sortOrder, self.value];
}
-(void)dealloc
{
    self.value = nil;
    [super dealloc];
}
@end

将您的对象添加到数组中。然后排序:

NSMutableArray *myArrayOfObjects = [NSMutableArray array];

//Add your objects
MyObject *obj = [[[MyObject alloc] init] autorelease];
obj.sortOrder = 1;
obj.value = @"A";
[myArrayOfObjects addObject:obj];

obj = [[[MyObject alloc] init] autorelease];
obj.sortOrder = 2;
obj.value = @"Q";
[myArrayOfObjects addObject:obj];

//Sort the objects according to importance (sortOrder in this case)
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES] autorelease];
NSArray *sortedArray = [myArrayOfObjects sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSLog(sortedArray);  //<--See for yourself that they are sorted
于 2013-02-10T04:03:10.070 回答
1

NSArray 有几个排序函数。您可能会考虑的三个是:

- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr

- (NSArray *)sortedArrayUsingSelector:(SEL)comparator

- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context

我想你可能会发现第二个基于选择器的比较器最容易上手。请参阅此处的文档:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/sortedArrayUsingSelector

编辑:

我认为使用 NSSortDescriptor 可能有点矫枉过正,但这里有一篇描述它的好帖子:

如何使用 sortedArrayUsingDescriptors 对 NSMutableArray 进行排序?

于 2013-02-10T04:01:59.873 回答