ios - objective - Ordenar un NSMutableDictionary
nsdictionary to object swift (6)
Tengo un NSMutableDictionary
que asigna NSString
a NSString
(aunque los valores son NSStrings
, en realidad son solo números enteros).
Por ejemplo, considere las siguientes asignaciones,
"dog" --> "4"
"cat" --> "3"
"turtle" --> "6"
Me gustaría terminar con las 10 mejores entradas en el diccionario ordenadas por orden decreciente del valor. ¿Puede alguien mostrarme el código para esto? Tal vez hay una matriz de claves y otra matriz de valores. Sin embargo es, no me importa. Solo estoy tratando de que sea eficiente.
¡Gracias!
La forma más sencilla es:
NSArray *sortedValues = [[yourDictionary allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSMutableDictionary *orderedDictionary=[[NSMutableDictionary alloc]init];
for(NSString *valor in sortedValues){
for(NSString *clave in [yourDictionary allKeys]){
if ([valor isEqualToString:[yourDictionary valueForKey:clave]]) {
[orderedDictionary setValue:valor forKey:clave];
}
}
}
Obtenga la matriz de los valores, ordene esa matriz y luego obtenga la clave correspondiente al valor.
Puedes obtener los valores con:
NSArray* values = [myDict allValues];
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)];
Pero, si la colección es como se muestra en su ejemplo (es decir, puede inferir el valor de la clave), siempre puede ordenar las claves en lugar de desordenar los valores.
Utilizando:
NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)];
El comparador es un selector de mensajes que se envía al objeto que desea ordenar.
Si desea ordenar cadenas, debe utilizar un comparador de NSString. Los comparadores NSString son: caseInsensitiveCompare o localizedCaseInsensitiveCompare :.
Si ninguno de estos son válidos para usted, puede llamar a su propia función de comparación
[values sortedArrayUsingFunction:comparatorFunction context:nil]
Siendo comparatorFunction (de AppleDocumentation )
NSInteger intSort(id num1, id num2, void *context)
{
int v1 = [num1 intValue];
int v2 = [num2 intValue];
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}
Ordenar las claves y usarlas para rellenar una matriz con los valores:
NSArray *keys = [dict allKeys];
NSArray *sKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sValues = [[[NSMutableArray alloc] init] autorelease];
for(id k in sKeys) {
id val = [dict objectForKey:k];
[sValues addObject:val];
}
Si desea ordenar los datos en orden ascendente para el ''nombre'' clave para este tipo de Ejemplo, esto puede ayudarlo.
arrayAnimalList = [{''name'' = Dog, ''animal_id'' = 001}, {''name'' = Rat, ''animal_id'' = 002}, {''name'' = Cat, ''animal_id'' = 003}];
Este es un código que te ayuda a ordenar la matriz.
//here you have to pass key for which you want to sort data
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
// here you will get sorted array in ''sortedArray''
NSMutableArray * sortedArray = [[arrayAnimalList sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
Utilice este método:
- (NSArray *)sortKeysByIntValue:(NSDictionary *)dictionary {
NSArray *sortedKeys = [dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
int v1 = [obj1 intValue];
int v2 = [obj2 intValue];
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}];
return sortedKeys;
}
Llámelo y luego cree un nuevo diccionario con claves ordenadas por valor:
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
@"4", @"dog",
@"3", @"cat",
@"6", @"turtle",
nil];
NSArray *sortedKeys = [self sortKeysByIntValue:dictionary];
NSMutableDictionary *sortedDictionary = [[NSMutableDictionary alloc] init];
for (NSString *key in sortedKeys){
[sortedDictionary setObject:dictionary[key] forKey:key];
}
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest" ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];