¿Cómo orderar una matriz de cadenas que contienen numbers y caracteres de forma personalizada en el objective-c?

¿Cómo puedo orderar una matriz de cadenas que contiene numbers Y caracteres? Mi tableView tiene esta información:

- (void)viewDidLoad { [super viewDidLoad]; self.tableData = [NSMutableArray array]; [self.tableData addObject:@"28 days"]; [self.tableData addObject:@"29 weeks"]; [self.tableData addObject:@"3 days"]; [self.tableData addObject:@"10 years"]; [self.tableData addObject:@"4 months"]; [self.tableData addObject:@"3 Weeks"]; [self.tableData addObject:@"27 Years"]; [self.tableData addObject:@"1 months"]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Sort" style:UIBarButtonItemStyleBordenetworking target:self action:@selector(sort)];} 

Y me gustaría clasificarlo de una manera "natural", donde los días son lo primero, luego las semanas, los meses, etc. y al mismo time, 2 días antes de 5 días, etc. ¿Es posible? o tengo que crear matrices separadas por semanas, meses, años, etc.?

Este es el código que utilicé:

 - (void)sort { NSSortDescriptor *sorter = [[NSSortDescriptor alloc]initWithKey:nil ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; NSArray *sortArray = [NSArray arrayWithObject:sorter]; NSArray *sortedArray = [self.tableData sortedArrayUsingDescriptors:sortArray]; [self.tableData removeAllObjects]; [self.tableData addObjectsFromArray:sortedArray]; [self.tableView reloadData];} 

Sin embargo, esto no resuelve el problema numérico y, de alguna manera, ni siquiera clasifica los datos de la manera correcta ^^

Sería útil si creara una class personalizada para contener sus cadenas en lugar de ponerlas directamente en la matriz. Entonces, esta class personalizada, además de contener las cadenas, puede contener un valor numérico para la duración. Este valor numérico se puede usar para orderar fácilmente y también puede ayudarlo más tarde cuando se trata de la selección del usuario y el uso de la elección del usuario.

Alternativamente, usaría uno de los methods de sorting como sortedArrayUsingComparator: y el código de suministro para verificar el contenido numérico y textual en las cadenas y elaborar el order (que no es tan fácil).

Si te comprendo correctamente, quieres orderar de forma que la duración más corta sea la primera y la más larga. Deberá analizar las cadenas usted mismo para get la cantidad de días, semanas, meses y años, calcular el número total de días y usar este número como la key de orderación en un método de sorting personalizado.

Suponiendo que 1 semana = 7 días, 1 mes = 30 días, 1 año = 365 días – que significa 5 semanas> 1 mes – esta podría ser una solución, aunque no es del todo correcta en relación con las matemáticas calendáricas.

Utiliza un dictionary como tabla de maps, separa el valor numérico y la unidad de calendar y calcula un valor numérico para comparar, respectivamente.

  NSDictionary *mapTable = @{@"ays" : @1, @"eks" : @7, @"ths" : @30, @"ars" : @365}; self.tableData = [NSMutableArray array]; [self.tableData addObject:@"28 days"]; [self.tableData addObject:@"29 weeks"]; [self.tableData addObject:@"3 days"]; [self.tableData addObject:@"10 years"]; [self.tableData addObject:@"4 months"]; [self.tableData addObject:@"3 Weeks"]; [self.tableData addObject:@"27 Years"]; [self.tableData addObject:@"1 months"]; [self.tableData sortUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) { NSArray *components1 = [str1 componentsSeparatedByString:@" "]; NSArray *components2 = [str2 componentsSeparatedByString:@" "]; NSInteger faktor1 = [[mapTable objectForKey:[components1[1] substringFromIndex:[components1[1] length] - 3]] integerValue]; NSInteger faktor2 = [[mapTable objectForKey:[components2[1] substringFromIndex:[components2[1] length] - 3]] integerValue]; return ([components1[0] integerValue] * faktor1) > ([components2[0] integerValue] * faktor2); }]; [self.tableView reloadData]; 

Creo que una solución más fácil y más flexible sería no almacenar sus objects como cadenas. Sus objects parecen representar dates o intervalos de time, que puede almacenar en su matriz como NSDate * o NSNumber * (de NSTimeInterval). En el caso de NSDate, su tipo se vuelve simple:

  [dates sortedArrayUsingComparator:^NSComparisonResult(NSDate *dateA, NSDate *dateB) { return [dateA compare:dateB]; }]; 

Mostrar sus datos se convierte en un simple problema NSDateComponents / NSDateFormatter: ¿Cómo puedo desglosar un NSTimeInterval en año, meses, días, horas, minutos y segundos en el iPhone?