29 votes

Obtention des clés du dictionnaire NSDictionary triées par leurs valeurs respectives

J'ai un NSMutableDictionary avec des valeurs entières, et je voudrais obtenir un tableau des clés, triées de manière ascendante par leurs valeurs respectives. Par exemple, avec ce dictionnaire :

mutableDict = {
    "A" = 2,
    "B" = 4,
    "C" = 3,
    "D" = 1,
}

J'aimerais finir avec le tableau ["D", "A", "C", "B"] . Mon vrai dictionnaire est bien plus vaste que ces quatre articles, bien sûr.

54voto

Hermann Klecker Points 8461

El NSDictionary Méthode keysSortedByValueUsingComparator: devrait faire l'affaire.

Vous avez juste besoin d'une méthode retournant un NSComparisonResult qui compare les valeurs de l'objet.

Votre dictionnaire est

NSMutableDictionary * myDict;

Et votre Array est

NSArray *myArray;

myArray = [myDict keysSortedByValueUsingComparator: ^(id obj1, id obj2) {

     if ([obj1 integerValue] > [obj2 integerValue]) {

          return (NSComparisonResult)NSOrderedDescending;
     }
     if ([obj1 integerValue] < [obj2 integerValue]) {

          return (NSComparisonResult)NSOrderedAscending;
     }

     return (NSComparisonResult)NSOrderedSame;
}];

Il suffit d'utiliser NSNumber au lieu de constantes numériques.

BTW, ceci est pris de : https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Dictionaries.html

22voto

Qwerty Bob Points 2738

NSDictionary a cette méthode géniale appelée allKeys .

Si vous voulez que le tableau soit trié, keysSortedByValueUsingComparator: devrait faire l'affaire.

La solution de Richard fonctionne également, mais fait quelques appels supplémentaires dont vous n'avez pas nécessairement besoin :

// Assuming myDictionary was previously populated with NSNumber values.
NSArray *orderedKeys = [myDictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1 compare:obj2];
}];

11voto

Richard J. Ross III Points 33152

Voici une solution :

NSDictionary *dictionary; // initialize dictionary
NSArray *sorted = [[dictionary allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [[dictionary objectForKey:obj1] compare:[dictionary objectForKey:obj2]];
}];

10voto

Rudolf Adamkovic Points 4202

La solution la plus simple :

[dictionary keysSortedByValueUsingSelector:@selector(compare:)]

2voto

tapash Points 14

Ici, j'ai fait quelque chose comme ceci :

NSMutableArray * weekDays = [[NSMutableArray alloc] initWithObjects:@"Sunday",@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday", nil];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSMutableArray *dictArray = [[NSMutableArray alloc] init];

for(int i = 0; i < [weekDays count]; i++)
{
    dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:i],@"WeekDay",[weekDays objectAtIndex:i],@"Name",nil];
    [dictArray addObject:dict];
}
NSLog(@"Before Sorting : %@",dictArray);

@try
{
    //for using NSSortDescriptor
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"WeekDay" ascending:YES];
    NSArray *descriptor = @[sortDescriptor];
    NSArray *sortedArray = [dictArray sortedArrayUsingDescriptors:descriptor];
    NSLog(@"After Sorting : %@",sortedArray);

    //for using predicate
    //here i want to sort the value against weekday but only for WeekDay<=5
   int count=5;
    NSPredicate *Predicate = [NSPredicate predicateWithFormat:@"WeekDay <=%d",count];
    NSArray *results = [dictArray filteredArrayUsingPredicate:Predicate];

    NSLog(@"After Sorting using predicate : %@",results);
}
@catch (NSException *exception)
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sorting cant be done because of some error" message:[NSString stringWithFormat:@"%@",exception] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert setTag:500];
    [alert show];
    [alert release];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X