Je ne comprends rien au tri des NSArray

sisopetronsisopetron Membre
19:54 modifié dans API AppKit #1
Bonjour,

J'ai besoin de votre aide.  Voilà  ce que je fais pour remplir un tableau :

[myArray addObject: [NSArray arrayWithObjects: [NSNumber numberWithInt: nbrJours], nom, details, nil]];


Les nbrJours, nom et details sont des variables définies précédemment par le programme, nbrJours est de type int et les deux autres de type string.

J'obtiens donc un tableau du style :
15&nbsp;  nom1&nbsp;  blabla1<br />10&nbsp;  nom2&nbsp;  blabla2<br />55&nbsp;  nom3&nbsp;  blabla3<br />...<br />


Je voudrais trier ce tableau en fonction de la première colonne. 

Pourriez-vous m'expliquer clairement ce que je dois écrire ?  Parce que entre KVC, descriptors etc ...  je me perds complètement.  Comment dois-je m'y prendre ?

Merci de votre aide.

tata !

Réponses

  • 19:54 modifié #2
    La solution la plus adequate serait de peupler "myArray" avec des NSDictionary.
    Un NSDictionary représente des couples clé/valeur

    <br />NSMutableDictionary* myDictionary = [NSMutableDictionary dictionary];<br />[myDictionary setObject:[NSNumber numberWithInt:nbrJours] forKey:@&quot;Nb Jours&quot;];<br />[myDictionary setObject:nom forKey:@&quot;Nom&quot;];<br />[myDictionary setObject:details forKey:@&quot;Details&quot;];<br /><br />[myArray addObject:myDictionary];<br /><br />
    


    À partir de là , tu peux utiliser NSSortDescriptor qui te permettras de trier ta array en renseignant la clé à  trier. Par exemple, si je veux classer mes entrées en fonction de la clé "Nom", et ce par ordre alphabétique, cela donnera :

    <br />NSSortDescriptor* desc = [NSSortDescriptor sortDescriptorWithKey:@&quot;Name&quot; ascending:YES];<br />[myArray sortUsingDescriptor:desc];<br />
    
    ;

    Tu peux aussi enchaà®ner les tries en utilisant "sortUsingDescriptors" (note le "s" en plus à  la fin)
    Par exemple pour trier d'abord par nom, puis par nombre de jours :
    <br />NSSortDescriptor* nameDesc = [NSSortDescriptor sortDescriptorWithKey:@&quot;Name&quot; ascending:YES];<br />NSSortDescriptor* nbJourDesc = [NSSortDescriptor sortDescriptorWithKey:@&quot;Nb Jours&quot; ascending:YES];<br />[myArray sortUsingDescriptors:[NSArray arrayWithObjects:nameDesc,nbJourDesc,nil]];<br />
    


  • sisopetronsisopetron Membre
    19:54 modifié #3
    Merci pour ton aide.  Je comprends bien mieux ce que je dois faire maintenant.

    A+ (sûrement  ;))
  • sisopetronsisopetron Membre
    19:54 modifié #4
    Une question supplémentaire pour ta peine  :P : est-ce que le fait de trier mon tableau modifie sa structure ?  Je m'explique : avant d'essayer de trier mon tableau, je l'utilisais non trié et je récupérais les valeurs ainsi :

    int nbrJours = [[[sortedArray objectAtIndex: i] objectAtIndex: 0] intValue];
    


    i est donné par une boucle for (i=0 à  sortedArray count-1).  Or maintenant cela ne marche plus : j'ai une erreur sur cette ligne : -[NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x280290  Je pense que cette erreur veut dire que je n'ai plus un tableau de structure i lignes sur 3 colonnes. 

    Où est donc l'erreur ?  Comment puis-je faire pour récupérer les enregistrements dans le tableau ?

    Merci.
  • 19:54 modifié #5
    C'est normal, tu as utilisé objectAtIndex: 2x.
    Lorsque tu fais [sortedArray objectAtIndex:i], tu obtiens maintenant un NSDictionary, et non pas un NSArray.
    Ainsi, pour récupérer nbrjours, tu dois faire :

    <br />int nbrJours = [[[sortedArray objectAtIndex:i] objectForKey:@&quot;Nb Jours&quot;] intValue];<br />
    


    Mais améliorons directement ta boucle :

    <br />for (NSDictionary* aDictionary in sortedArray)<br />{<br />&nbsp;  int nbrJours = [[aDictionary objectForKey:@&quot;Nb Jours&quot;] intValue];<br />}<br />
    
  • sisopetronsisopetron Membre
    19:54 modifié #6
    Merci mille fois.  A cette allure-là , grâce à  toi, dans 2 jours je passe pro du cocoa.  :D

    A bientôt.

    Didier
Connectez-vous ou Inscrivez-vous pour répondre.