2010-05-08 5 views
1

У меня есть массив с именем 'names' со строками, похожим на: ["name_23_something", "name_25_something", "name_2_something"]; Теперь я хотел бы отсортировать этот массив в порядке возрастания, чтобы он выглядел так: ["name_25_something", "name_23_something", "name_2_something"];Сортировка массива, содержащего строки в объекте c

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

for(NSString *name in arr) { 
    NSArray *nameSegments = [name componentsSeparatedByString:@"_"]; 
    NSLog("number: %@", (NSString*)[nameSegments objectAtIndex:1]);  
} 

Я подумываю о создании словаря с ключами, но я не уверен, если это правильный объективный способ, возможно, есть некоторые методы, которые я мог бы использовать вместо этого? Не могли бы вы рассказать мне несколько советов или пример кода, как эта сортировка должна быть выполнена надлежащим образом.

Спасибо

ответ

2
@implementation NSString (MySort) 

- (int) myValue { 
    NSArray *nameSegments = [self componentsSeparatedByString:@"_"]; 
    return [[nameSegments objectAtIndex:1] intValue]; 
} 

- (NSComparisonResult) myCompare:(NSString *)other { 
    int result = [self myValue] - [other myValue]; 
    return result < 0 ? NSOrderedAscending : result > 0 ? NSOrderedDescending : NSOrderedSame; 
} 

@end 

... 

arr = [arr sortedArrayUsingSelector:@selector(myCompare:)]; 
2

Отъезд -[NSArray sortedArrayUsingComparator:].

+0

К сожалению, не доступно на iPhone OS. –

+1

@ed: нет, но небольшое ингибирующее использование полосы прокрутки выводит нас из этой записи в документации на множество других методов '-sortedArrayUsing ...'. – 2010-05-08 14:44:26

1

Благодарим за ответы!

Я сделал так, как вы думаете:

NSInteger sortNames(id v1, id v2, void *context) { 
    NSArray *nameSegments = [(NSString*)v1 componentsSeparatedByString:@"_"]; 
    NSArray *nameSegments2 = [(NSString*)v2 componentsSeparatedByString:@"_"]; 
    int num1 = [[nameSegments objectAtIndex:1] integerValue]; 
    int num2 = [[nameSegments2 objectAtIndex:1] integerValue]; 
    if (num1 < num2) 
     return NSOrderedDescending; 
    else if (num1 > num2) 
     return NSOrderedAscending; 

    return NSOrderedSame; 
} 

names = [names sortedArrayUsingFunction:sortNames context:nil]; 

Это приведет:

["name_25_something", "name_23_something", "name_2_something"]; 
+0

Это выглядит хорошо, кроме имени функции. 'compareNames' будет лучше. – iPadDeveloper2011

Смежные вопросы