2010-08-24 18 views
0

s'il vous plaît aidez-moi je veux trier NSMutableArray et oui je peux le faire parTrier NSMutableArray

NSSortDescriptor *sortPoint = [[NSSortDescriptor alloc] initWithKey:@"point" ascending:YES]; 
[hightScore sortUsingDescriptors:[NSArray arrayWithObject:sortPoint]]; 

mais NSMuatableArray (hightScore), j'ai 2 NSMutableDictionary comme ce

[item setObject:@"player_name" forKey:@"name"]; 
[item setObject:@"100" forKey:@"point"]; 

et quand Je trie par mot-clé "point" qui est une chaîne qu'il me donne comme ça 100> 20> 30> 50 devrait être au lieu 20> 30> 50> 100

avoir des idées d'idée.

Répondre

1

Il existe trois solutions:

  1. Mettre les instances NSNumber dans les dictionnaires en place des chaînes (par exemple, @"100") vous avez actuellement. Les objets NSNumber doivent se comparer numériquement.
  2. Envoyer un message le tableau sortUsingComparator: ou sortUsingFunction:context: au lieu de sortUsingDescriptors:, le passage d'un bloc ou une fonction qui récupère les chaînes et les compare numériquement (en les envoyant compare:options: messages avec l'option NSNumericSearch).

    Notez que le bloc ou la fonction sera transmis à l'ensemble des dictionnaires, pas aux chaînes, car il n'a aucun moyen de savoir quelles chaînes extraire, donc vous devrez vous-même extraire les chaînes des dictionnaires afin de Comparez-les.

  3. Remplacez les dictionnaires par model objects ayant properties à la place des clés du dictionnaire. Si vous déclarez la propriété avec un type numérique (par exemple, NSUInteger), lorsque le tableau utilise KVC pour accéder à la propriété, il recevra des objets NSNumber, qui, comme indiqué au point 1 ci-dessus, doivent se comparer numériquement.

Je voudrais aller aveC# 3.

+0

comment déclarer la propriété avec un type numérique? –

+0

Attribuez-lui un type numérique lorsque vous le déclarez. La documentation à laquelle je suis lié vous montre comment déclarer une propriété. –

+0

très merci j'utilise le choix et ça marche !. c'est mon code pour tout le monde [article setObject: [NSNumber numberWithInt: [[[_ modeObject valueForKey: @ "point"] description] intValue]] forKey: @ "point"]; ** article est NSMutableArray –

0
NSMutableArray* tempArray = [NSMutableArray arrayWithArray:anArray]; 
[tempArray sortUsingSelector:@selector(caseInsensitiveCompare:)]; 

J'utiliser dans un code? Est-ce que ça va marcher?

De plus, vous venez de remarquer que vous définissez les objets du tableau comme des chaînes dont je suppose qu'elles poseront également un problème. Essayez de les ajouter en tant que NSIntegers ou ints ... cela fonctionne-t-il?

+0

Le problème est que le questionneur compare chaînes par défaut, ce qui n'est pas une comparaison numérique. 'caseInsensitiveCompare:' n'est pas non plus une comparaison numérique. –

+0

hmm, juste assez –

+0

c'est mon code: [item setObject: [NSNumber numberWithInt: [[[modeObject valueForKey: @ "point"] description] intValue]] forKey: @ "point"]; peut-être vous aider^____^ –

1

La meilleure façon de le faire est de stocker vos numéros comme NSNumbers:

[index addObject:[[NSNumber alloc] initWithInt:number]]; 

Ensuite, vous pouvez trier votre tableau en utilisant la méthode [NSNumber compare:]:

[index sortUsingSelector:@selector(compare:)];