сортировка NSArray из NSStrings по совпадению - PullRequest
1 голос
/ 15 февраля 2011

Как я могу отсортировать NSArray путем поиска по шаблону? Поэтому, если, например, у меня есть шаблон поиска, равный 'xd', и массив значений:

axd
bxd
xdd
gtxd
xdc

как я могу получить вывод, как показано ниже:

xdc 
xdd 
axd 
bxd 
gtxd

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Используйте NSArray sortedArrayUsingFunction: с функцией, которая упорядочивает сначала по позиции поискового термина, а затем по естественному порядку строк.

NSInteger sorter(id arg1, id arg2, void *context)
{
    NSString *searchTerm = (NSString *)context;

    NSRange range1 = [arg1 rangeOfString:searchTerm];
    NSRange range2 = [arg2 rangeOfString:searchTerm];

    if (range1.location < range2.location)
        return NSOrderedAscending;
    if (range1.location > range2.location)
        return NSOrderedDescending;

    return [arg1 compare:arg2];
}

NSArray *array = [NSArray arrayWithObjects:@"axd", @"bxd", @"xdd", @"gtxd", @"xdc", nil];
NSArray *sortedArray = [array sortedArrayUsingFunction:sorter context:@"xd"];

Это печатает:

2011-02-15 01:33:49.642 GreatApp[78849:a0f] (
    xdc,
    xdd,
    axd,
    bxd,
    gtxd
)
1 голос
/ 15 февраля 2011

Вы можете использовать метод NSArray sortedArrayUsingFunction:context::

NSInteger occurenceSort(NSString* s1, NSString* s2, void *context)
{
    NSRange range1 = [s1 rangeOfString:(NSString*)context];
    NSRange range2 = [s2 rangeOfString:(NSString*)context];

    if (range1.location < range2.location)
        return NSOrderedAscending;
    else if (range1.location > range2.location)
        return NSOrderedDescending;

    return NSOrderedSame;
}

...
NSString *stringToSearch = @"xd";
NSArray *sorterArray = [yourArray sortedArrayUsingFunction:occurenceSort context:stringToSearch];
...