按字母顺序对自定义对象的NSMutableArray进行排序

时间:2012-01-18 02:39:55

标签: ios5 nsmutablearray

我有一个自定义对象的NSMutableArray。自定义对象(Tag Class)有两个属性定义如下:

@interface Tag : NSObject

@property (strong, nonatomic) NSString *tid;
@property (strong, nonatomic) NSString *name;

所以,我想通过Tag名称对这些Tag对象的NSMutableArray进行排序 - 我该怎么做?

另外,我应该在加载数组时对其进行排序,还是在每次读取内容时对其进行排序?

2 个答案:

答案 0 :(得分:4)

有几种方法可以在目标c中对可变数组进行排序。

我发现最简单的是使用 [NSMutableArray sortUsingFunction:] 方法。

对于您的示例,此类内容应足以满足排序功能

NSComparisonResult sortTagByName(Tag *tag1, Tag *tag2, void *ignore)
{
    return [tag1.name compare:tag2.name];
}

这是一个完整的源代码清单,您可以使用它来建立解决方案:

#import <Foundation/Foundation.h>


@interface Tag : NSObject {

}

@property (strong, nonatomic) NSString *tid;
@property (strong, nonatomic) NSString *name;

@end

@implementation Tag 
@synthesize tid;
@synthesize name;


@end

NSComparisonResult sortTagByName(Tag *tag1, Tag *tag2, void *ignore)
{
    return [tag1.name compare:tag2.name];
}

@interface stackExDemo : NSObject

@end


@implementation stackExDemo

+(void) demo {

    NSMutableArray * array = [NSMutableArray array];

    // add your objects here


    [array sortUsingFunction:sortTagByName context:nil];

}

@end

将其分解为相关的组成部分:

功能

NSComparisonResult sortTagByName(Tag *tag1, Tag *tag2, void *ignore)
{
    return [tag1.name compare:tag2.name];
}

这只是一个简单的C函数(即不是一个方法,所以你不需要在任何特定类的实现部分中定义它,但是在它应用的类中定义它通常是有意义的)。

在上面的示例中,我已经在之后将定义为@end for Tag,只是为了明确它是类方法。

我命名为“ignore”的参数是排序的“上下文”。在这种情况下,没有上下文,所以我们将忽略它的价值。

由于您是基于NSString属性进行排序,因此NSString的compare方法很方便,但您也可以手动返回{NSOrderedAscending,NSOrderedSame,NSOrderedDescending}

之一

调用排序

  [array sortUsingFunction:sortTagByName context:nil];

这会反复调用数组中每个元素的函数,以对数组进行排序。

如果你想更具体地说明排序类型,NSString中有许多其他方法可以进行比较,这里是NSString.h的“剪切和粘贴”,如果你开始使用它可以让你开始我想进一步研究它。

- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale; // locale arg used to be a dictionary pre-Leopard. We now accepts NSLocale. Assumes the current locale if non-nil and non-NSLocale.
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
- (NSComparisonResult)localizedCompare:(NSString *)string;
- (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;

在回答第二个问题时,只要添加或移动了可能导致数组未排序的元素,就需要这样做。

希望这会有所帮助。

答案 1 :(得分:3)

我知道最简单的方法是使用sortDescriptor:

// Sort the tags by name 
NSSortDescriptor * firstDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]

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