Как отсортировать массив с буквенно-цифровыми значениями? - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть массив, который содержит строки, такие как frame_10@3x.png, frame_5 @ 3x.png, frame_19 @ 3x.png и т. Д. Поэтому я хочу отсортировать этот массив по числу после подчеркивания, то есть правильная последовательность будет frame_5 @ 3x.png, frame_10 @ 3x.png, frame_19 @ 3x.png.

Я пытался использовать следующий метод, но безрезультатно:

NSInteger firstNumSort(id str1, id str2, void *context) {
    int num1 = [str1 integerValue];
    int num2 = [str2 integerValue];

    if (num1 < num2)
        return NSOrderedAscending;
    else if (num1 > num2)
        return NSOrderedDescending;

    return NSOrderedSame;
}

Подскажите, пожалуйста, как сделать эту сортировку для массива.

Ответы [ 4 ]

8 голосов
/ 26 декабря 2011
NSArray *sry_img = [[NSArray alloc]    initWithObjects:@"frame_18@3x.png",@"frame_17@3x.png",@"frame_1222@3x.png",@"frame_10@3x.png",@"frame_3@3x.png",@"frame_4@3x.png",@"frame_4@3x.png",@"frame_1@3x.png",@"frame_4@3x.png",@"frame_4@3x.png",nil];
  NSArray *sortedStrings  = [sry_img sortedArrayUsingSelector:@selector(localizedStandardCompare:)];

NSLog(@"%@",sortedStrings);

Enjy .......

Но localizedStandardCompare:, добавленный в 10.6, должен использоваться всякий раз, когда имена файлов или другие строки представлены в списках и таблицах, где сортировка по типу Finder уместна,Точное поведение этого метода может быть изменено в будущих выпусках и будет отличаться при разных локализациях, поэтому клиенты не должны зависеть от точного порядка сортировки строк.

0 голосов
/ 26 декабря 2011

Я не уверен, является ли мое решение наилучшим из возможных подходов, но пока оно может решить вашу проблему :).

1) Сначала я написал функцию для получения чисел перед символом @ в вашей строке, а затем реализовал простой алгоритм SELECTION SORT для сортировки массива с помощью этой функции.это выборка реализации алгоритма сортировки.Основная логика в цикле for.Вы можете скопировать код в методе viewDidLoad для тестирования.

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"frame_10@3x.png",@"frame_5@3x.png",
                         @"frame_3@3x.png", @"frame_19@3x.png",
                         nil];    
NSLog(@"Values before Sort: %@", array);

int iPos;
int iMin;

for (iPos = 0; iPos < [array count]; iPos++)
{

    iMin = iPos;

    for (int i = iPos+1; i < [array count]; i++)
    {            

        if ([[self getSubStringForString:[array objectAtIndex:i]] intValue] > 
            [[self getSubStringForString:[array objectAtIndex:iMin]] intValue]) {
            iMin = i;
        }

    }

    if ( iMin != iPos )
    {
        NSString *tempValue = [array objectAtIndex:iPos];
        [array replaceObjectAtIndex:iPos withObject:[array objectAtIndex:iMin]];
        [array replaceObjectAtIndex:iMin withObject:tempValue];

    }
}

NSLog(@"Sorted Values: %@", array);

Я надеюсь, что он может по крайней мере поддерживать вас.:)

0 голосов
/ 26 декабря 2011

Вы можете попробовать это-

NSString *str1 = [[[[str1 componentsSeparatedByString:@"frame_"] objectAtIndex:1]       componentsSeparatedByString:@"@3x.png"] objectAtIndex:0];
int num1 = [str1 integerValue];
0 голосов
/ 26 декабря 2011

вы хотите сделать что-то вроде:

NSArray *components1 = [str1 componentsSeparatedByString:@"_"];
NSArray *components2 = [str2 componentsSeparatedByString:@"_"];

NSString *number1String = [components1 objectAtIndex:([components1 count] - 1])];
NSString *number2String = [components2 objectAtIndex:([components2 count] - 1])];

return [number1String compare:number2String];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...