2010-05-30 3 views
1

Je suis en train d'écrire un programme pour mon iphone et ai une question.
laisse dire que j'ai classe nommée my_objTableau de pointeurs en Objective-C utilisant NSArray

class my_obj 
{ 
    NSString *name; 
    NSinteger *id; 
    NSinteger *foo; 
    NSString *boo; 
} 

maintenant j'allouent 100 objets de types my_obj et les insérer à la matrice à partir du type NSArray.
Ensuite, je veux trier le tableau de deux façons différentes. un par le nom et le second par
l'id.

je veux allouer deux autres tableaux à partir du type NSArray

*arraySortByName  
*arraySortById 

ce que je dois faire si je veux juste les tableaux triés à être référencés au tableau d'origine
donc je vais obtenir deux tableaux triés que pointez sur le tableau d'origine (qui n'a pas changé!)
Je ne veux pas d'allouer 100 autres objets à chaque tableau trié.

+0

Dans quelle langue la classe est-elle déclarée? Est-ce censé être C++? –

Répondre

4

Vous pouvez utiliser la méthode NSArraysortedArrayUsingFunction:context: (ou les autres fonctions de tri NSArray) qui renvoie un nouveau tableau.

De la documentation:

Le nouveau tableau contient des références aux éléments du récepteur des, pas des copies.


Si vous voulez dire que les tableaux triés devraient juste être des pointeurs sur le tableau original, comment est-ce censé fonctionner? L'ordre des éléments dans les tableaux triés est différent.

Ou je n'ai pas reçu votre question.

+0

ce que je veux faire est d'imprimer les tableaux triés dans quelques endroits dans mon code et je ne veux pas les trier chaque fois que je veux imprimer le tableau. donc je vais garder deux tableaux triés qui référencé au tableau original et les imprimer quand je veux. – Amir

+0

@Amir: Donc, vous devriez être bien avec les fonctions de tri normales. –

+0

considérer la première réponse: je ne peux pas utiliser NSArray parce que le tableau n'est pas de type NSString mais my_object. donc je dois utiliser le nsmutablearray et là la méthode sortedArrayUsingFunction: context: retournera void. donc la réponse ne m'a pas aidé beaucoup. – Amir

2

C'est vraiment facile. Check it:

NSSortDescriptor * sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
NSSortDescriptor * sortByID = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES]; 

NSArray * sortedByName = [original sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortByName]]; 
NSArray * sortedByID = [original sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortByID]]; 

Cela pas créer des copies de vos objets. Vous aurez donc toujours 100 objets my_obj attribués.

+0

Je ne comprends pas complètement ce que NSSortDescriptor fait? qu'est-ce que sortDescriptorWithKey? disons que je veux trier par le nom de la propriété (chaîne) comment j'initialiser l'objet NSSortDescriptor * sortByName pour faire cela? Si je fais référence au code ci-dessus et que je suppose que l'original du tableau contient 100 objets de my_obj, l'objet sortedByName fait-il référence aux 100 objets d'origine afin qu'ils trient alfa betic selon le nom de propriété (chaîne) de my_obj? – Amir

+0

@Amir un descripteur de tri est une abstraction de la façon de trier une collection d'objets. Pensez-y comme une clause "ORDER BY" dans une requête SQL. Si vous voulez trier par le 'nom' d'un objet, alors la clé que vous utilisez est' @ "name" '. Pour trier par 'myIntegerProperty', la clé est' @ "myIntegerProperty" '. Vos objets ne seront pas copiés. Le tableau trié contiendra simplement des références à vos objets d'origine. –

+0

Quelqu'un peut m'aider avec la déclaration de 100 objets de type my_obj? J'ai un message xml qui contient des informations sur 100 objets de type my_obj comment puis-je allouer 100 objets à l'avance? en C++ ce sera my_obj obj [100]; ou my_obj * obj = new obj [100]; Quelle est la syntaxe dans l'objectif c? et comment j'accède à ces objets? (en C++: obj [x] = etc.) merci – Amir

Questions connexes