web-dev-qa-db-fra.com

Trier un NSMutableDictionary

J'ai un NSMutableDictionary qui mappe NSString à NSString (bien que les valeurs soient NSStrings, elles ne sont en réalité que des entiers).

Par exemple, considérons les mappages suivants,

"dog" --> "4"
"cat" --> "3"
"turtle" --> "6"

J'aimerais que les 10 premières entrées du dictionnaire soient triées par ordre décroissant de la valeur. Quelqu'un peut-il me montrer le code pour cela? Il existe peut-être un tableau de clés et un autre tableau de valeurs. Quoi qu'il en soit, ça ne me dérange pas. J'essaie juste de le rendre efficace.

Je vous remercie!

19
CodeGuy

Obtenez le tableau des valeurs, triez ce tableau, puis obtenez la clé correspondant à la valeur.

Vous pouvez obtenir les valeurs avec:

NSArray* values = [myDict allValues];
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)];

Mais, si la collection est celle que vous montrez dans votre exemple (vous pouvez en déduire la valeur à partir de la clé), vous pouvez toujours trier les clés au lieu de jouer avec les valeurs.

En utilisant:

NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)];

Le comparateur est un sélecteur de message qui est envoyé à l'objet que vous souhaitez commander.

Si vous souhaitez commander des chaînes, vous devez utiliser un comparateur NSString . Les comparateurs NSString sont, par exemple,: caseInsensitiveCompare ou localizedCaseInsensitiveCompare :.

Si aucun d’entre eux n’est valable, vous pouvez appeler votre propre fonction de comparaison.

[values sortedArrayUsingFunction:comparatorFunction context:nil]

Être comparatorFunction (from 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;
}
46
HyLian

Utilisez cette méthode:

- (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;
}

Appelez-le puis créez un nouveau dictionnaire avec des clés triées par valeur:

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];
}
4
kraftydevil

Le moyen le plus simple est:

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];
        }
    }
}
4
Luis Andrés García

Trier les clés et utiliser cela pour remplir un tableau avec les valeurs:

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];
}
3
hburde
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest"  ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];
0
iDilip

si vous souhaitez trier les données dans l'ordre croissant pour la clé 'nom' pour ce type d'exemple, cela peut vous aider.

arrayAnimalList = [ { 'name' = Chien, 'animal_id' = 001 }, { 'name' = Rat, 'animal_id' = 002 }, { 'name' = Cat, 'animal_id' = 003 } ];

Ceci est un code qui vous aide à obtenir un tableau trié

//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];
0