Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Mac

Mac Avant de poster: Lire La FAQ Mac; Voir la page Outils; Voir les tutoriels.

Réponse
 
Outils de la discussion
Vieux 28/08/2008, 15h51   #1 (permalink)
mmx
Futur Membre du Club
 
Date d'inscription: janvier 2006
Messages: 36
Par défaut Tri de NSMutableArray (Descriptor : A vos Marque ! prêt ! Partez !)

Bonjour,


J'ai le besoin de trier un NSMutableArray composé d'objets, étant eux aussi des NSMutableArray. En fait, je mets dans un tableau global, tout un tas de petits tableaux à une dimension, de deux valeurs, en gros j'ai :

[x1, y1]
[x2, y2]
[xn, yn]

J'ai fait ça comme ça :

Code :
litleArray = [[NSMutableArray alloc] init];
				
				[litleArray addObject:gravityCenterOrdonnee];
				[litleArray addObject:gravityCenterAbscisse];
				
				
				[gravityCenterTabular addObject:litleArray];
Ce que je voudrais, c'est trier (ordre croissant) gravityCenterTabular, mon tableau de tableau, suivant les X (la première valeur des sous tableaux), sachant qu'il faut bien sûr que les Y suivent, sinon, mes coordonnées de points n'ont plus aucun sens

J'ai essayé des choses en utilisant des Descripteur mais je n'ai pas tout compris :/

Code :
NSSortDescriptor* sortDescriptor = 
[[[NSSortDescriptor alloc] initWithKey:@"@min"  ascending:YES] autorelease];

[gravityCenterTabular sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
Le problème vient que je ne sais pas comment lui faire comprendre à partir de quoi il doit faire le tri, et ensuite, encore moins comment lui dire de faire suivre les y comme il faut en fonction des x.... enfin, en gros, rien ne marche :p


Vous pouvez me sortir de la ?
Merci d'Avance.
mmx est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 29/08/2008, 01h00   #2 (permalink)
Rédacteur
 
Date d'inscription: février 2003
Messages: 161
Par défaut

Pas de quoi casser trois pattes à un canard.

Voici un exemple:

Citation:

//
// Pour l'exemple on créer 4 points de coordonnées x et y
//

NSDictionary *test1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:10],nil] forKeys:[NSArray arrayWithObjects:@"x",@"y",nil]];

NSDictionary *test2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInt:3],[NSNumber numberWithInt:3],nil] forKeys:[NSArray arrayWithObjects:@"x",@"y",nil]];

NSDictionary *test3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInt:2],[NSNumber numberWithInt:1],nil] forKeys:[NSArray arrayWithObjects:@"x",@"y",nil]];

NSDictionary *test4 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInt:3],[NSNumber numberWithInt:2],nil] forKeys:[NSArray arrayWithObjects:@"x",@"y",nil]];

//
// On génère le tableau de points en vrac et on trace ce que ça donne
//

NSArray *list = [NSArray arrayWithObjects:test1,test2,test3,test4,nil];
NSLog(@"En desordre:\n%@",[list description]);

//
// On trie avec un descripteur en x et on trace ce que ça donne
//

NSSortDescriptor* sortDescriptorX = [[[NSSortDescriptor alloc] initWithKey:@"x" ascending:YES] autorelease];

NSArray *listX =[list sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptorX]];
NSLog(@"En ordre par x:\n%@",[listX description]);

//
// On trie avec le descripteur en x plus un second en y et on trace ce que ça donne
//

NSSortDescriptor* sortDescriptorY = [[[NSSortDescriptor alloc] initWithKey:@"y" ascending:YES] autorelease];

NSArray *listXY =[list sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptorX,sortDescriptorY,nil]];

NSLog(@"En ordre par x puis y:\n%@",[listXY description]);
Ce qui nous donne:
Citation:
2008-08-29 00:50:06.453 Cerbere[9574:10b] En desordre:
(
{
x = 1;
y = 10;
},
{
x = 3;
y = 3;
},
{
x = 2;
y = 1;
},
{
x = 3;
y = 2;
}
)
2008-08-29 00:50:06.455 Cerbere[9574:10b] En ordre par x:
(
{
x = 1;
y = 10;
},
{
x = 2;
y = 1;
},
{
x = 3;
y = 3;
},
{
x = 3;
y = 2;
}
)
2008-08-29 00:50:06.455 Cerbere[9574:10b] En ordre par x puis y:
(
{
x = 1;
y = 10;
},
{
x = 2;
y = 1;
},
{
x = 3;
y = 2;
},
{
x = 3;
y = 3;
}
)
Elle est pas belle la vie?
Mala est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 29/08/2008, 13h28   #3 (permalink)
mmx
Futur Membre du Club
 
Date d'inscription: janvier 2006
Messages: 36
Par défaut

Bonjour,

Citation:
Elle est pas belle la vie?
Pas tout-à-fait, en fait, la tu créer des tableaux de deux valeurs, pour lesquelles correspondent une clé du descripteur. Cependant, moi j'ai un tableau de tableau, comment j'associe la première clé à ma première colonne et la deuxième clé à la deuxième colonne ?

Je ne dois quand même pas créer autant de NSDictionary *test que j'ai de sous-tableaux dans mon tableau...?


Sinon j'ai aussi un tableau d'une seule dimension avec les mêmes valeurs organisées comme : [x0, y0, x1, y1, ... , ... xn, yn]. un couple de coordonné est donc accessible en i et i+1.


Vois-tu ce que je veux dire ?

Merci en tous cas.


En fait j'ai réussi, je crois bien. Mais j'ai un autre petit problème Dans List, j'ai qu'un seul objet. Je n'arrive plus à accéder aux valeurs à partir du tableau trié...:'(

Dernière modification par mmx ; 29/08/2008 à 15h10 Motif: J'ai avancé :)
mmx est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 29/08/2008, 15h47   #4 (permalink)
Rédacteur
 
Date d'inscription: février 2003
Messages: 161
Par défaut

Citation:
Envoyé par mmx Voir le message
Vois-tu ce que je veux dire ?
Ok oui cela m'avait échappé. Là je sais pas si c'est envisageable avec NSSortDescriptor pour des NSArray.

Tu es dans un cas un peu particulier. En règle générale, on identifie les "colonnes" par un identifiant qui sert aussi de clef pour l'affichage. Je pense là en l'occurrence à l'affichage du résultat directement vers une NSTableView. D'où l'utilisation de dictionnaires pour chaque "ligne".
Mala est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/08/2008, 10h58   #5 (permalink)
mmx
Futur Membre du Club
 
Date d'inscription: janvier 2006
Messages: 36
Par défaut

Bon, et bien...

Je vais ressortir le bon vieux tri à bulle, faire une passe sur x, puis une sur y en essayant de tout changer comme il faut à chaque fois à coup de exchangeObjectsAtIndex:

Même si ça ne m'a pas servi, au moins j'aurais un peu mieux compris les descripteurs. A moins que quelqu'un ait une autre zolie idée

Merci et à plus.
mmx est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 31/08/2008, 11h48   #6 (permalink)
Membre émérite
 
Date d'inscription: septembre 2006
Messages: 730
Par défaut

Citation:
Envoyé par mmx Voir le message
Bon, et bien...

Je vais ressortir le bon vieux tri à bulle, faire une passe sur x, puis une sur y en essayant de tout changer comme il faut à chaque fois à coup de exchangeObjectsAtIndex:

Même si ça ne m'a pas servi, au moins j'aurais un peu mieux compris les descripteurs. A moins que quelqu'un ait une autre zolie idée

Merci et à plus.
http://developer.apple.com/documenta...ction:context:
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/09/2008, 14h33   #7 (permalink)
mmx
Futur Membre du Club
 
Date d'inscription: janvier 2006
Messages: 36
Par défaut

Bonjour,

Et bien fait fait ça se complique car je me suis rendu compte qu'un tri d'abord sur x puis sur y ne convient pas vraiment, il y a une toute petite nuance. Il faut partir du principe que x et y sont des coordonnées de points, et ces points constituent une grille. Pour avoir les coordonnées organisés comme cela :

1 5 ..
2 6 ..
3 7 ..
4 8 ..

il faut que je fasse un tri sur x, ça c'est bon, c'est fait. Mais ensuite il faut faire un tri croissant sur y mais que pour la première colonne des x, puis un autre tri croissant sur y sur la deuxième colonne... et ceci jusqu'à la fin.

Je ne peux pas m'appuyer sur le nombre de points par colonne (il est variable), je ne peux que m'appuyer sur les variations de x. En effet, pour des petites variations de x (c'est que le point et toujours sur la même colonne) je fais le tri sur y (en gardant la correspondance des x bien sûr) puis lorsque la variation d'un x à l'autre est plus grande, c'est que j'ai changé de colonne, et je recommence.


J'ai vraiment du mal du point de vue de l'algo pour faire ça, z'avez pas une petite idée pour m'aider... la sortUsingFunction:context peut réaliser ce dont j'ai besoin ?

Merci d'avance.
mmx est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/09/2008, 21h43   #8 (permalink)
Rédacteur
 
Date d'inscription: février 2003
Messages: 161
Par défaut

Pas très clair tout ça.
Mala est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/09/2008, 22h18   #9 (permalink)
Membre émérite
 
Avatar de Spootnik
 
Date d'inscription: janvier 2007
Localisation: Toulouse !
Âge: 18
Messages: 845
Par défaut

Moi non plus j'ai rien compris .
__________________
Développeur amateur en C, C++ et Objective-C sous Mac OS X 10.5.
Portage en cours par mes soins de la SFML pour Mac OS X.

Je ne réponds par MP qu'aux messages strictement personnels.
Spootnik est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/09/2008, 15h10   #10 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: avril 2008
Messages: 21
Par défaut

@mala
J'aime bien ton émoicone.

Pour le topic, Monsieur Descartes disait:

Un problème bien posé est à demi résolu.
XDev1 est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Mac



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide