2010-07-21 15 views
5

Estoy tratando de ordenar un arreglo que sería algo como esto: (por favor, ignora el hecho de que estas personas son mucho más allá de cualquier edad que viven un gran número I solo es necesario!)Ordenación de un NSArray por un valor NSDictionary

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"sam",@"name",@"28.00",@"age",nil]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"cody",@"name",@"100.00",@"age",nil]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"marvin",@"name",@"299.00",@"age",nil]; 
NSDictionary *person4 = [NSDictionary dictionaryWithObjectsAndKeys:@"billy",@"name",@"0.0",@"age",nil]; 
NSDictionary *person5 = [NSDictionary dictionaryWithObjectsAndKeys:@"tammy",@"name",@"54.00",@"age",nil]; 

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:person1,person2,person3,person4,person5,nil]; 

// before sort 
NSLog(@"%@",arr); 

NSSortDescriptor *ageSorter = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES]; 
[arr sortUsingDescriptors:[NSArray arrayWithObject:ageSorter]]; 

// after sort 
NSLog(@"%@",arr); 

Ahora, antes de ordenar la salida sería:

2010-07-21 10:46:31.898 Sorting[70673:207] (
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

y después de la clase:

2010-07-21 10:46:31.900 Sorting[70673:207] (
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

Como se puede ver qué tipo, pero desde mi entendimiento está la clasificación por cadena. Lo he intentado, pero después de unos días de error al tratar de escribir un método que pudiera solucionarlo, todavía estoy perdido. ¿Cuál sería el mejor enfoque y lo lograr así que ordena por un valor numérico?

+0

¿Por qué no ¿Guarda la edad como número? [NSNumber numberWithFloat: 28.0f]; – Gobra

+0

Porque el guión real con el que estoy trabajando se extrae utilizando JSON, por lo que viene como un objeto de cadena; de lo contrario, lo haría :) – cdnicoll

Respuesta

10

Aunque pongo en duda el uso de cadenas aquí, la forma más sencilla de trabajar con esos datos con los siguientes:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    NSString *age1 = [item1 objectForKey:@"age"]; 
    NSString *age2 = [item2 objectForKey:@"age"]; 
    return [age1 compare:age2 options:NSNumericSearch]; 
}]; 

O, usando más recientes características subíndices de Objective-C:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    return [item1[@"age"] compare:item2[@"age"] options:NSNumericSearch]; 
}]; 
+0

Tuve que modificar esto al tacto pero funcionó, ¡gracias! – cdnicoll

0

Lo más fácil sería almacenar la edad como un número en lugar de una cadena.

+0

Vea mi comentario anterior. Viene como un objeto JSON, por lo que no puedo convertirlo exactamente en un valor int. – cdnicoll

Cuestiones relacionadas