2010-02-18 121 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