tri (sort) de deux NSMutableArray liés

Bonjour, et merci d'avance (lol)


voila , j ai deux NSMutableArray : variable (des double)  et effectif (des long)  (je fais des stats)


je voudrais trier les deux en même temps


je sais déjà  trier l'un indépendament de l'autre en faisant :



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


mais le problème est que si le tableau variable est bien trié, celui effectif ne l est pas donc on perd la correspondance...


 


et si je trie les deux successivement,



[variable sortUsingSelector : @selector(compare:)];
[effectif sortUsingSelector : @selector(compare:)];

c est pareil, même pire, chacun est trié indépendamment de l'autre donc leur lien est perdu aussi


 


quelqu un a t il deja eu le meme problème ?


merci


 


pare:)];


 


 

 


 


Réponses

  • samirsamir Membre

    Bonjour,


     


    Désolé, j'ai pas bien compris ta question :)


     


    C'est quoi la relation entre les deux Arrays ? et pour quoi le tri de l'un influence le tri de l'autre ?


  • bonjour


    parce que


     


    variable(i)=la valeur de la série statistique


    effectif(i)=l'effectif (ie le nombre de fois que cette valeur est atteinte dans la série statistique)


     


    si tu ordonnes variable selon les variable croissant, effectif lui n est pas ordonné en meme temps et du coup tu n a plus avec l index i, la correspondance entre la variable et son effectif...


  • samirsamir Membre
    mai 2013 modifié #4

    Ok.


     


    Pour garder la correspondance entre les deux liste, moi j'aurais créer un dictionnaire avec les clés la valeur de la série statistique et la valeur de la clé l'effectif, comme ça tu pourra trier ton dictionnaire avec les clés si tu veux. 


     


    Un truc de genre :



    NSDictionnary *dict = [NSDictionnary initWithObjects:tonArrayEffectif forKeys:tonArrayStatistique];

    ensuite si tu veux trier les valeurs :



    NSArray *listValeursStatistique = [dict allKeys];

    .....


  • Ici il est dit 



    Generally, in Cocoa and Cocoa Touch, parallel arrays make work while model objects save work

    Faire un objet modèle avec une @property (assign)float variable et une @property (assign) long effectif (ou un dictionnaire comme le suggère samir) serait le moyen de t'en sortir à  moindre frais.


  •  ok merci pour ces réponses, je vais essayer tout cela 


  • merci ça marche !


    ::)


  • Tu peux retrouver tes deux tableaux d'origine en faisant


    tableauVariable = [tableauObjetsVariableEffectif valueForKeyPath:@variable];


    Et les habituels count/distinctValues/average/max/min si besoins avec les opérateurs sur les tableaux.

  • reBonjour,


    J'ai à  nouveau un petit soucis que je n'arrive pas à  résoudre, par rapport à  ce que j'ai écrit ci-dessus.


    Imaginons un tableau variable = 7, 6, 1, 3, 4, 2, 5


    et un tableau effectif = 2 , 75 , 34 , 62 , 75 , 19 , 75 ainsi qu'un 3eme tableau correspondant aux frequence que je calcule aussi


     


    quand je veux trier les trois tableaux, qui sont liés (la variable 7 a un effectif de 2 et une frequence de ..., la variable 6 a un effectif de 75 et une frequence de ...) en ordonnant selon variable, j'utilise le code suivant :



    -(void)trieTableau{ // trie le tableau selon valeurs de xi croissantes, les effectif ni suivent dans le même ordre !

    // Put the two arrays into a dictionary as keys and values
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:effectif forKeys:variable];
    // Sort the first array variable
    NSArray *sortedVariable= [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
    // Sort the second array effectif based on the sorted first array
    NSArray *sortedEffectif = [dictionary objectsForKeys:sortedVariable notFoundMarker:[NSNull null]];


    // Sort the third array frequence based on the sorted first array
    NSDictionary *dictionary2 = [NSDictionary dictionaryWithObjects:frequence forKeys:variable];
    NSArray *sortedFrequence = [dictionary2 objectsForKeys:sortedVariable notFoundMarker:[NSNull null]];

    variable=[sortedVariable copy];
    effectif=[sortedEffectif copy];
    frequence=[sortedFrequence copy];

    }


    et cela marche parfaitement, mais le problème est que quand je veux trier ces mêmes tableaux selon l effectif ou la frequence croissante, comme il y a plusieurs effectifs identiques (ce qui ne peut jamais arriver avec variable) un seul est compté ! du coup les tableaux finaux sont tronqués....Voici le code que j utilise :



    -(void)trieTableauFreq{ // trie le tableau selon les valeurs de fréquence fi croissantes // CA VA PAS LA !!!! S ARRETE DES QUE UNE FREQUENCE IDENTIQUE APPARAIT PLUS D UNE FOIS !!!!
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:effectif forKeys:frequence];
    NSArray *sortedFrequence= [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
    NSArray *sortedEffectif = [dictionary objectsForKeys:sortedFrequence notFoundMarker:[NSNull null]];

    NSDictionary *dictionary2 = [NSDictionary dictionaryWithObjects:variable forKeys:frequence];
    NSArray *sortedVariable = [dictionary2 objectsForKeys:sortedFrequence notFoundMarker:[NSNull null]];

    variable=[sortedVariable copy];
    effectif=[sortedEffectif copy];
    frequence=[sortedFrequence copy];
    }

    je suis très novice et ne vois pas comment régler mon problème


    merci de ma voir lu et d avoir éventuellement une réponse...


    :-*


  • AliGatorAliGator Membre, Modérateur

    Fais toi plutôt un objet (appellons-le "Stat") représentant un triplet {variable, effectif, fréquence} (une sous-classe de NSObject avec 3 @property donc). C'est ça que tu vas manipuler, car ces 3 variables sont liées à  chaque fois et tu ne veux pas qu'elles soient dissociées.


     


    Ensuite, plutôt que de faire 3 NSArray (un pour variable, un pour effectif, un pour fréquence), tu vas plutôt te faire un tableau d'objet Stat, puisque chaque objet Stat regroupe variable+effectif+fréquence tout en un.


    Du coup quand tu vas trier ce tableau, tu vas trier des objets Stat, et pas juste des entiers. Et donc ce sont les objets Stat qui seront réordonnés (d'après la propriété que tu veux, en l'occurrence selon la variable ou selon la fréquence, au choix), mais pour chaque Stat la variable sera toujours liée à  son effectif et sa fréquence, tu ne risques pas d'avoir 3 tableaux à  trier et de risquer de mélanger les données et ne plus avoir de correspondance.


     


    Une fois que tu as ton NSArray* statsList d'objet Stats, pour les trier, rien de plus simple :


     - Soit tu utilises des NSSortDescriptor, qui vont te permettre de préciser via quelle(s) clé(s) / propriété(s) tu veux trier tes objets et si tu les veux dans l'ordre croissant/décroissant. Pour ça tu peux utiliser ce genre de code :

    NSArray* sortedArray = [statsList sortedArrayUsingDescriptors: @[; [NSSortDescriptor sortDescriptorWithKey:@frequence ascending:YES] ] ];

     - Soit tu utilises un block qui va permettre de décrire comment doivent être comparés chaque élément (la doc appelle ça un "Comparator Block"), avec ce genre de code :

    NSArray* sortedArray = [statsList sortedArrayUsingComparator:^(id obj1, id obj2) {
     return [ [(Stat*)obj1 frequence] compare: [(Stat*)obj2 frequence] ];
    }];

  • je te remercie beaucoup pour cette réponse rapide


    je vais essayer cela !


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