Сортировка строк с номерами последней цели c - PullRequest
3 голосов
/ 25 августа 2011

У меня был хороший поиск SO, но я не смог найти ничего подходящего для этой проблемы. У меня есть собственный класс объекта, который реализует метод сравнения для сортировки в массивах. Это сравнение использует свойство "name" класса с помощью NSCaseInsensitiveSearch. Код выглядит так:

- (NSComparisonResult)compare:(Forum *)otherObject {
return [self.name compare:otherObject.name options:(NSCaseInsensitiveSearch)];
}

Однако использование NSCaseInsensitiveSearch ставит строки с числами перед строками с буквами. Есть ли способ сделать противоположное этому, чтобы цифры следовали за буквами?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Преобразуйте строки для сравнения, используя 256- (16-битный) массив перевода символов (при условии, что у вас есть только стандартные символы ASCII). Переведите большинство символов в их собственные значения (или в нижний регистр, чтобы обрабатывать функцию без учета регистра одновременно), но переведите цифры в их значения плюс некоторое число (скажем, 0xF000). Затем сравните строку.

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

1 голос
/ 25 августа 2011

Не просто

return [self.name compare:otherObject.name options:(NSCaseInsensitiveSearch)];

Но сделайте некоторые дополнительные проверки, например, если self.name начинается не с цифры, а otherObject.name начинается с цифры, тогда возвращается NSDescendingOrder, и наоборот. IOW, сделать цифру> не цифрой. Если оба не числовые или оба числовые, верните то, что у вас уже было.

Эта небольшая консольная программа объясняет принцип, который я имею в виду:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMutableArray *array = [NSMutableArray arrayWithObjects: 
                             @"Adam", @"001", @"Bertha", @"3SeriesBMW", @"Colin",
                             @"Zelda", @"1And1", @"Xaver", @"Kraftwerk", @"TangerineDream",
                             @"5SeriesBMW", @"0ableTypes", nil];

    NSString *sortOrder = @"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz_0123456789";

    [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) 
    {
        char char1 = [(NSString *)obj1 characterAtIndex: 0];
        char char2 = [(NSString *)obj2 characterAtIndex: 0];

        int index1;
        for (index1 = 0; index1 < sortOrder.length; index1++)
            if ([sortOrder characterAtIndex: index1] == char1)
                break;

        int index2;
        for (index2 = 0; index2 < sortOrder.length; index2++) 
            if ([sortOrder characterAtIndex: index2] == char2)
                break;

        if (index1 < index2)
            return NSOrderedAscending;
        else if (index1 > index2)
            return NSOrderedDescending;
        else
            return [(NSString *)obj1 compare: obj2 options: NSCaseInsensitiveSearch];
    }];

    for (NSString *s in array)
        NSLog(@"%@", s);

    [pool drain];
    return 0;
}

Вывод:

2011-08-25 14:19:15.538 NumeralSort[5802:707] Adam
2011-08-25 14:19:15.540 NumeralSort[5802:707] Bertha
2011-08-25 14:19:15.540 NumeralSort[5802:707] Colin
2011-08-25 14:19:15.540 NumeralSort[5802:707] Kraftwerk
2011-08-25 14:19:15.541 NumeralSort[5802:707] TangerineDream
2011-08-25 14:19:15.541 NumeralSort[5802:707] Xaver
2011-08-25 14:19:15.541 NumeralSort[5802:707] Zelda
2011-08-25 14:19:15.542 NumeralSort[5802:707] 001
2011-08-25 14:19:15.542 NumeralSort[5802:707] 0ableTypes
2011-08-25 14:19:15.542 NumeralSort[5802:707] 1And1
2011-08-25 14:19:15.543 NumeralSort[5802:707] 3SeriesBMW
2011-08-25 14:19:15.543 NumeralSort[5802:707] 5SeriesBMW

Это не совсем решение, но оно должно помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...