Aller au contenu


Photo

trier un tableau composé de 3 NSNumber


  • Please log in to reply
38 réponses à ce sujet

#1 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 27 avril 2017 - 13:04

Bonjour à tous 

 

J'ai un tableau composé d'un tableau de 3 NSNumber, de la façon suivante : 

NSMutableArray *tableauPrincipal = [[NSMutableArray alloc]init];

    NSNumber *V1 = [NSNumber numberWithInt:1];
    NSNumber *V2 = [NSNumber numberWithInt:5];
    NSNumber *V3 = [NSNumber numberWithInt:0];

    NSMutableArray *arrayDeNumber = [NSMutableArray arrayWithContentsOfURL:V1,V2,V3,nil];

[tableauPrincipal addObject: arrayDeNumber];
.....

A titre d'exemple, voici en ordre de saisie ce que j'ai : 

 

V1 V2 V3

1   5    0

3   7    5

2   3    6

0   5    8

 

et je voudrais après le tri sur V1: 

V1 V2 V3

0   5    8

1   5    0

2   3    6

3   7    5

 

Je voudrais donc connaitre la solution la plus simple .... sans avoir à créer un objet spécifique pour ça!!!

 

Merci d'avance

 

 

 


#2 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 950 messages
  • LocationParis

Posté 27 avril 2017 - 13:19

J'avouerai que je ne suis pas sûr d'avoir saisi toute la logique.

 

Si tu souhaites trier un NSMutableArray, tu peux juste appeler une des nombreuses méthodes (en fonction de ton tri) sortUsing...: de NSMutableArray


Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#3 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 27 avril 2017 - 13:28

oui bien sûr mais je ne veux trier que par rapport à V1



#4 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 950 messages
  • LocationParis

Posté 27 avril 2017 - 13:35

Je suis un peu perdu, parce que j'ai dû mal à trouver la relation entre ton code et le "schéma". (surtout que j'ai un arrayWithContentsOfURL: qui fait je ne sais quoi ici).

Quand tu dis ne vouloir trier que par rapport à V1, là, ça me met sur la piste que ton modèle est peut-être erroné. En tout cas, c'est pas clair. J'aurais besoin d'un véritable exemple de code et du résultat final souhaité.


Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#5 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 27 avril 2017 - 13:51

Ah oui

Non c'est une erreur de ma part, il s'agit de         

 

NSMutableArray *arrayDeNumber = [NSMutableArray arrayWithObjects:V1,V2,V3,nil];

 

Donc voici le code


    NSMutableArray *tableauPrincipal = [[NSMutableArray alloc]init];
    
    for (int i=0; i<10; i++)
    {
        NSNumber *V1 = [NSNumber numberWithInt:(rand()%100)+1];
        NSNumber *V2 = [NSNumber numberWithInt:(rand()%100)+1];
        NSNumber *V3 = [NSNumber numberWithInt:(rand()%100)+1];
    
        NSMutableArray *arrayDeNumber = [NSMutableArray arrayWithObjects:V1,V2,V3,nil];
    
        [tableauPrincipal addObject: arrayDeNumber];
    
    } 
    Ce que je veux, c'est que tableauPrincipal[0] ai la plus petite valeur de V1 et que tableauPrincipal[9] ai la plus grande valeur de V1 sachant que V2 et V3 doivent correspondre à V1 (revoir l'exemple de ci dessus)


#6 Lexxis

Lexxis

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 404 messages

Posté 27 avril 2017 - 14:08

Je verrai deux solutions:

1/ La plus simple

Une classe V dont les champs serait V1, V2, V3, ... . Pour le tri il suffit ensuite d'utiliser les méthodes de tri de NSArray (sortusing...) comme l'a indiquer Larme.

2/ Solution "un peu plus complexe mais après tout cela dépend des besoins"

Avoir un NSNumber V qui serait la concaténation de V1*1000000 + V2 * 1000 + V3. V1, V2 et V3 serait limité de 0 à 999 (sinon cela ne fonctionne pas). Pour le tri il faut aussi utiliser les fonctions de tri de NSArray (encore)



#7 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 27 avril 2017 - 14:14

Ok mais pour le sort using : j'ai essayé ça mais ça plante : 

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES] autorelease];
    NSArray *sort = [NSArray arrayWithObject:sortDescriptor];
    
    [tableauPrincipal sortUsingDescriptors:sort];


#8 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 950 messages
  • LocationParis

Posté 27 avril 2017 - 14:25

Vite fait:

NSMutableArray *tableauPrincipal = [[NSMutableArray alloc]init];
   
    for (int i = 0; i < 10; i++)
    {
        NSNumber *v1 = [NSNumber numberWithInt:(rand()%100)+1];
        NSNumber *v2 = [NSNumber numberWithInt:(rand()%100)+1];
        NSNumber *v3 = [NSNumber numberWithInt:(rand()%100)+1];
       
        NSMutableArray *arrayDeNumber = [NSMutableArray arrayWithObjects:v1,v2,v3,nil];
        [tableauPrincipal addObject: arrayDeNumber];
    }
    NSLog(@"Tableau Principal: %@", tableauPrincipal);
   
    [tableauPrincipal sortUsingComparator:^NSComparisonResult(NSMutableArray * _Nonnull obj1, NSMutableArray * _Nonnull obj2) {
        NSComparisonResult result;
        for (NSUInteger i = 0; i < 3; i ++)
        {
            result = [obj1[i] compare:obj2[i]];
            if (result != NSOrderedSame)
            {
                return result;
            }
        }
        return NSOrderedSame;
    }];
   
    NSLog(@"Tableau Principal Sorted: %@", tableauPrincipal);

Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#9 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 27 avril 2017 - 14:34

GENIAL....

Merci à toi Larme

 

Mais dis moi, comment la fonction sait qu'il s'agit de trier sur V1 et pas sur les autres, du coup, si je voulais faire un tri sur V2 cette fois ci???

 

Merci d'avance



#10 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 950 messages
  • LocationParis

Posté 27 avril 2017 - 15:30

Explication du block:

​NSComparisonResult result;
for (NSUInteger i = 0; i < 3; i ++)
{
    result = [obj1[i] compare:obj2[i]];
    if (result != NSOrderedSame)
    {
        return result;
    }
}
return NSOrderedSame;

Tu compares tes arrays un à un (obj1 et obj2)

La for loop sert à comparer les sous-éléments (NSNumber) du même index entre obj1 et obj2.

Si ils ne sont pas égaux, alors ça trie selon ce critère.

Sinon, on compare les deux suivants. S'ils ne sont pas égaux, alors on trie selon ce critère.

Sinon, on compare les deux suivants, etc.

S'ils sont tous égaux, on renverra OrderedSame.

 

Donc tel quel, on va comparer v1 et v1' et trier si possible, sinon v2 et v2' et trier si possible, puis v3' et v3'.

 

J'ai fait ça car j'ai supposé que c'était ce que tu voulais.

 

 

 

Si tu veux uniquement comparer sur v1 (qui est le premier élément sans te soucier des valeurs de v2 et v3), dans le block, tu écris uniquement :

return [obj1[0] compare:obj2[0]];

En décomposant, cela revient à :

NSNumber *v11 = obj1[0];
NSNumber *v12 = obj2[0];
return [v11 compare:v12];

Si tu veux comparer uniquement sur v2 :

return [obj1[1] compare:obj2[1]];

Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#11 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 888 messages
  • LocationPlestin-les-Grèves (22)

Posté 27 avril 2017 - 15:56

Pareil que Larme mais avec les petits trucs de code :

 NSMutableArray *tableauPrincipal = [NSMutableArray array];
  
  for (int i=0; i < 10; i++)
  {
    NSNumber *V1 = [NSNumber numberWithInt:(rand()%100)+1];
    
    NSNumber *V2 = [NSNumber numberWithInt:(rand()%100)+1];
    
    NSNumber *V3 = [NSNumber numberWithInt:(rand()%100)+1];
    
    NSArray *arrayDeNumber = @[V1,V2,V3];
    
    [tableauPrincipal addObject: arrayDeNumber];
  }
  
  [tableauPrincipal sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2)
  {
    return [obj1[0] compare:obj2[0]];
  }];
  
  NSLog(@"%@", tableauPrincipal); 

(Je l'ai fait au même temps que Larme et je ne voulais pas le gaspiller  ::) )



#12 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 950 messages
  • LocationParis

Posté 27 avril 2017 - 16:03

Pourquoi tu passes par integerValue et en déduis toi-même un NSOrderedZzZ alors que NSNumber le fait très bien tout seul ?


Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#13 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 27 avril 2017 - 16:21

Encore un énormes merci à tous pour ces renseignements



#14 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 888 messages
  • LocationPlestin-les-Grèves (22)

Posté 27 avril 2017 - 16:45

Pourquoi tu passes par integerValue et en déduis toi-même un NSOrderedZzZ alors que NSNumber le fait très bien tout seul ?

 

 

 

Paah !! Tu l'as vu avant que je l'ai édité  ::)



#15 Mick

Mick

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 240 messages
  • LocationEure

Posté 31 mai 2017 - 12:25

Bonjour,

 

au niveau du modèle, ce ne serait pas plus simple de faire un NSArray de dictionnaires ? Il y a alors un NSArray, et le tri se fait tout seul avec les NSSortDescriptors, non ?Il semble que tu veuilles que ces 3 valeurs soit "un objet", et pas 3 objets indépendants ? Le tableau contient ainsi des triplets de nombres, ce qui évite 3 tableaux différents, à gérer simultanément. Mais après je ne sais pas ce que tu en fais, donc e suis peut-être à coté de la plaque sur tes besoins.

NSMutableArray *donnees=[[NSMutableArray alloc] init];
        for (int i=0; i<3; i++) {
            NSNumber *V1=[NSNumber numberWithInt:rand()%10+1];
            NSNumber *V2=[NSNumber numberWithInt:rand()%10+1];
            NSNumber *V3=[NSNumber numberWithInt:rand()%10+1];
            NSMutableDictionary *uneDonneeCEst3Nombres=[NSMutableDictionary dictionaryWithObjectsAndKeys:V1,@"V1",V2,@"V2",V3,@"V3", nil];
            [donnees addObject:uneDonneeCEst3Nombres];
        }
        NSLog(@"Tri par V1 croissant : %@",[donnees sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"V1" ascending:YES]]]);
        
        NSLog(@"Tri par V2 croissant : %@",[donnees sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"V2" ascending:YES]]]);
        
        NSLog(@"Tri par V3 croissant : %@",[donnees sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"V3" ascending:YES]]]);
 


#16 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 12:36

Bonjour Mick

 

C'est vrai que je n'avais pas pensé à cette solution qui est assez simple au fond...Je ne pense jamais assez aux dictionnary

 

Merci à toi



#17 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 888 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 12:40

Les dictionnaires ne sont ni nécessaires ni triés



#18 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 12:42

...mais dans l'organisation de Mick, ça marche non ?



#19 Mick

Mick

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 240 messages
  • LocationEure

Posté 31 mai 2017 - 12:50

Bonjour Joanna, je ne comprends pas ce que tu veux dire. Les dictionnaires ne sont pas triés, ce n'est pas leur vocation, ça on est d'accord. Je pense que Fred veut des triplets de nombres, pas des nombres indépendants. J'imagine par exemple que la première "colonne" du tableau correspond à une "qualité" d'un objet plus grand, du genre la position "x" d'un point, la seconde la position "y" et la troisième la position "z" d'un même point. Mais je me trompe peut-être sur le but de la chose encore une fois. Et à la place du dictionnaire, une sous-classe NSObject peut-être plus adaptée.



#20 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 888 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 12:53

J'ai déjà montré le bon code avec les Arrays.






1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)