2010-02-18 3 views
1

У меня есть NSArray следующим образом:Сортировка NSArray

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

Файлы в 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] 

Я сделал много предположений, но этот код работает на вашем массиве образцов a аналогичные входные значения.
Основное предположение состоит в том, что вы хотели получить этот конкретный заказ только для строк, начинающихся с числового значения. Если это не так, вы можете использовать этот код, чтобы адаптировать его к алгоритму, который вы хотите.

+0

Хорошее решение +1. – erastusnjuki

2

Я думаю, что самое простое решение состоит в использовании 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

+0

Для достижения порядка сортировки он хочет, он может потребоваться другой селектор, потому что он хочет сортировать численно нисходящую сортировку, но с текстом ниже цифр. – MrMage

+0

Спасибо в любом случае Грег. Это правда pheelicks n Mr. M. – erastusnjuki