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

Ios5 按字母顺序对自定义对象的NSMutableArray排序,ios5,nsmutablearray,Ios5,Nsmutablearray,我有一个自定义对象的NSMutableArray。自定义对象标记类有两个定义如下的属性: @interface Tag : NSObject @property (strong, nonatomic) NSString *tid; @property (strong, nonatomic) NSString *name; 因此,我想按标记名对这些标记对象的NSMutableArray进行排序-我该如何做 另外,我应该在数组加载时对其进行排序,还是在每次读取其内容时对其进行排序?我知道的最简单

我有一个自定义对象的NSMutableArray。自定义对象标记类有两个定义如下的属性:

@interface Tag : NSObject

@property (strong, nonatomic) NSString *tid;
@property (strong, nonatomic) NSString *name;
因此,我想按标记名对这些标记对象的NSMutableArray进行排序-我该如何做


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

我知道的最简单的方法是使用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];

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

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

对于您的示例,类似这样的内容应该足以满足sort函数

下面是一个完整的源代码列表,您可以使用它来建立解决方案:

#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
这只是一个普通的C函数,即不是一个方法,因此您不需要在任何特定类的实现部分中定义它,但是在它应用的类中定义它通常是有意义的

在上面的示例中,我在@end for标记后面定义了它,只是为了明确它不是类方法

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

由于您是基于NSString属性进行排序的,因此NSString的比较方法很方便,但是您也可以手动返回{nsOrderedAscing,nsOrderedName,nsOrderedEscing}

调用排序

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

如果您想更具体地了解排序类型,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;
在回答第二个问题时,您需要在添加或移动可能导致数组未排序的元素时执行此操作


希望这会有所帮助。

这不会对NSMutable数组进行排序,而是会创建一个您传递到其中的标记数组的不可变副本。如果这是你想做的,那就太好了,不过从OP的问题的措辞来看,我怀疑这不是被问到的问题。请参阅我的答案,了解如何对NSMutable数组中的元素进行排序的示例。Ecarrion-感谢您提供了非常简单的解决方案。然而,不同步是正确的,我需要数组是可变的。可能不是最好的方法,但如果您正在寻找一种简单的方法,您可以始终这样做:tagsArray=[[tagsArray sortedarray usingdescriptors:descriptors]mutableCopy];美丽的非常感谢你!
NSComparisonResult sortTagByName(Tag *tag1, Tag *tag2, void *ignore)
{
    return [tag1.name compare:tag2.name];
}
  [array sortUsingFunction:sortTagByName context:nil];
- (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;