2010-02-18 76 views
1

我有一个NSArray如下:排序一个NSArray

NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath:filePath]; 

在文件路径的文件有:

11.thm,12.thm,13.thm,...,Text_21。 THM,Text_22.thm,Text_23.thm,...

我想给NSArray的顺序进行排序:

13.thm,12.thm,11.thm,...,Text_23.thm,Text_22.thm,Text_21.thm,...

如何实现这一目标?

回答

5

编写自定义排序函数:

NSInteger customSortingFunctionReversedAndNumericFirst(NSString *string1, NSString *string2, void *context) { 
    NSCharacterSet *decimalCharacterSet; 
    BOOL firstStringStartsWithNumeric, 
     secondStringStartsWithNumeric; 


    decimalCharacterSet = [NSCharacterSet decimalDigitCharacterSet]; 
    firstStringStartsWithNumeric = [decimalCharacterSet characterIsMember:[string1 characterAtIndex:0]]; 
    secondStringStartsWithNumeric = [decimalCharacterSet characterIsMember:[string2 characterAtIndex:0]]; 



    if (firstStringStartsWithNumeric != secondStringStartsWithNumeric) { 
     return firstStringStartsWithNumeric ? NSOrderedAscending : NSOrderedDescending; 
    } 

    return [string2 compare:string1 options:NSNumericSearch]; 
}

,并使用它像这样:

NSArray *sortedDirectoryContent = [directoryContent sortedArrayUsingFunction:customSortingFunctionReversedAndNumericFirst context:NULL] 

我做了很多的假设,但是这段代码对你的样本数组有效找到类似的输入值。
主要假设是您只需要以数值开头的字符串的这种特定顺序。如果不是这种情况,您可以使用此代码将其调整为您想要的算法。

+0

好的解决方案+1。 – erastusnjuki 2010-02-18 12:06:51

2

我认为simpliest解决方案是使用sortedArrayUsingSelector:与caseInsensitiveCompare:(来自的NSString):

NSArray *sortedDirectoryContent = 
[directoryContent sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
+0

您的代码不会根据请求对数组进行排序。它将按照以下顺序返回文件:11.thm,12.thm,13.thm,...,Text_21.thm,Text_22.thm,Text_23.thm,... – pheelicks 2010-02-18 10:03:54

+0

为了实现他想要的排序顺序,他可能需要一个不同的选择器,因为他希望按数字降序排序,但文本的数量低于数字。 – MrMage 2010-02-18 10:04:38

+0

感谢格雷格。这是真的pheelicks n先生M. – erastusnjuki 2010-02-18 10:23:39