Trier un NSMutableArray avec plusieurs clés

RocouRocou Membre
juin 2010 modifié dans API AppKit #1
Bonjour,

J'aimerais trier un NSMutableArray avec une clé primaire et des clés secondaires.
Avec une seule clé, je procède ainsi:
//maListeRecherche est un NSMutableArray<br /><br />NSSortDescriptor* sortDescriptorClient = [[[NSSortDescriptor alloc] initWithKey:@&quot;client&quot; ascending:YES] autorelease];	<br />NSArray *maListeTrie =[maListeRecherche sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptorClient]];<br />maListeRecherche = [maListeTrie mutableCopy];


Voilà  ma liste triée sur la clé client.
Imaginons qu'il s'agisse d'une liste de clients entrant dans un magasin. Je vais avoir plusieurs fois les mêmes clients entrant dans un magasin dans le mois.

Je veux que ma liste soit triée sur la clé "client" d'abord puis sur la clé "date" par exemple, comment procéder?

Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2010 modifié #2
    Bah c'est pas compliqué, tu fais pareil, sauf que dans sortedArrayUsingDescriptors, au lieu de passer un array avec un eul sortDescriptor, tu passes un NSArray avec... deux sortDescriptors. Le premier pour le client, le second pour la date.

    Au passage, tu as une belle fuite mémoire dans ton code (tu ne release pas l'ancien maListeRecherche avant de lui affecter une nouvelle valeur)

    PS : Utilise la balise [tt][co[/tt][tt]de]...[/co[/tt][tt]de][/tt] pour rendre ton code plus lisible (j'ai modifié pour toi pour cette fois)
  • RocouRocou Membre
    juin 2010 modifié #3
    dans 1277807094:

    Bah c'est pas compliqué, tu fais pareil, sauf que dans sortedArrayUsingDescriptors, au lieu de passer un array avec un eul sortDescriptor, tu passes un NSArray avec... deux sortDescriptors. Le premier pour le client, le second pour la date.

    Merci Ali mais je me doute bien qu'il faille deux sortDescriptors  d'autant que sortedArrayUsingDescriptors est au pluriel :) mais en pratique, on fait comment? (il me reste de nombreuses lacunes objc/cocoa...)

    J'ai essayé ceci mais ça ne fonctionne pas du tout:
    NSArray *maListeTrie =[maListeRecherche sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptorClient,sortDescriptorDate]];
    


    dans 1277807094:

    Au passage, tu as une belle fuite mémoire dans ton code (tu ne release pas l'ancien maListeRecherche avant de lui affecter une nouvelle valeur)

    B) Oops! Merci! Je me fie trop au "build and analyse" qui dans ce cas ne trouve rien à  redire

    dans 1277807094:

    PS : Utilise la balise [tt][co[/tt][tt]de]...[/co[/tt][tt]de][/tt] pour rendre ton code plus lisible (j'ai modifié pour toi pour cette fois)

    Oui mais la balise code ne permets pas de réduire la taille des caractères et elle génère un ascenseur horizontal. Je n'aimais pas, d'où ce style  perso :)
  • RocouRocou Membre
    16:51 modifié #4
    Honte sur moi  :D

    J'ai oublié le nil final. Bon sang que de temps perdu!

    NSArray *maListeTrie =[maListeRecherche sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptorClient,sortDescriptorDate, nil]];
    



    Merci pour ton aide.
  • AliGatorAliGator Membre, Modérateur
    juin 2010 modifié #5
    Et pour le coup comme il y a une "sentinel" (vi ala macro NS_REQUIRES_NIL_TERMINATION de mémoire, un truc comme ça) sur cette déclaration de méthode Apple, le Build & Analyze devrait te remonté que tu as oublié le nil, justement...

    Je crois qu'il faut le flag -Wformat pour que ce warning soit levé (flag qui doit bien avoir une ligne d'option correspondante dans les Build Settings (une case à  cocher, plutôt que de le rajouter dans les "Additional Compiler Flags", je suppose), mais Build & Analyze doit certainement activer tous les warnings -- de toute façon ça serait pas un mal d'en activer un max pour coder propre...
Connectez-vous ou Inscrivez-vous pour répondre.