我有一个自定义对象的NSMutableArray。自定义对象(Tag Class)有两个属性定义如下:
@interface Tag : NSObject
@property (strong, nonatomic) NSString *tid;
@property (strong, nonatomic) NSString *name;
所以,我想通过Tag名称对这些Tag对象的NSMutableArray进行排序 - 我该怎么做?
另外,我应该在加载数组时对其进行排序,还是在每次读取内容时对其进行排序?
答案 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];