按string值sortingstring的NSMutableArray

我用下面的string得到一个string数组,string有一个特定的模式

str1 str51 str3 str4 str4 str10 str39 str31 str191

每个string都以'str'开头,并在其末尾添加一个数字。

是否有一个很好的方法来sorting数组,以便按值的顺序列出string

str1 str3 str4 str10 str31 str31 str39 str51 str191

我可以通过编写一些recursion函数来实现

NSString * firstString = [[strArray objectAtIndex:i].substringFromIndex:3]; NSString * secondString = [[strArray objectAtIndex:i+1].substringFromIndex:3]; if ([firstString intValue] < [secondString intValue]) { //do nothing they order is correct } else { //swap the order of the 2 strings in the array } 

但是这是非常基本的代码,Objective-C中有一些机制或更好的代码技巧来更好地处理这种sorting吗?

非常感谢,代码

如果他们都以相同的前缀开始,我相信默认sorting将适当地处理它们。 我的意思是:

 [someArray sortUsingSelector:@selector(compare:)]; 

如果由于某种原因,这不起作用,那么你可以使用一个块。 尝试这个:

 NSArray *sortedArray = [someArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { //Default compare, to protect against cast if (![a isKindOfClass:[NSString class]] || ![b isKindOfClass:[NSString class]]) { return ([a compare:b]); } else { NSString *aString = (NSString*) a; NSString *bString = (NSString*) b; int aInt = [[a.substringFromIndex:3] intValue]; int bInt = [[b.substringFromIndex:3] intValue]; return [aInt < bInt]; } }]; 

你可以这样sorting

 NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSString * str1 = [(NSString *)obj1 substringFromIndex:3]; NSString * str2 = [(NSString *)obj2 substringFromIndex:3]; return [str1 compare:str2 options:NSNumericSearch]; }]; 

你可以用你想要的任何行为来定义一个比较函数。 下面的代码将模拟Mac OS中Finder的行为,忽略大小写,并尊重string末尾出现的数字。 但是,顺序依赖于提供的语言环境,所以如果你想要的结果是绝对一致的,你应该select一个语言环境并对其进行硬编码。

 int finderSortWithLocale(id string1, id string2, void *locale) { static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch; NSRange string1Range = NSMakeRange(0, [string1 length]); return [string1 compare:string2 options:comparisonOptions range:string1Range locale:(__bridge NSLocale *)locale]; } 

您一定要阅读每个选项的文档,以确保它符合您的要求。

要使用这样的比较器来有效地对string数组进行sorting,请使用sortedArrayUsingFunction:context: method:

 NSArray *sortedArray = [stringsArray sortedArrayUsingFunction:finderSortWithLocale context:(__bridge void *)[NSLocale currentLocale]]; 

创build一个NSSortDescriptor,然后按键排列数组:“description”。 喜欢这个:

 NSMutableArray *array = [NSMutableArray arrayWithCapacity:0]; //Your Array of NSStrings NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES]; array = [array sortedArrayUsingDescriptors:@[descriptor]]; 
 NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"datetime" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName]; NSArray *sortedArray = [myArrayNonsort sortedArrayUsingDescriptors:sortDescriptors]; 

sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare :)];

input:anArray输出:sortedArray

参考文档