Trier un dictionnaire contenant d'autre collections

6ix6ix Membre
11:50 modifié dans API AppKit #1
Hello,

Mon problème porte sur le tri d'un dictionnaire "complexe".

Ma structure est la suivante:
- Dict1 (NSDictionnary) contient des objets Objet1
- ... qui contiennent chacun un tableau Array2 (NSArray)
- ... qui contient des objet Objet3
- ... qui contiennt chacun une CLLocation (car sur iPhone, mais le problème n'est pas lié à  une spécificité iPhone).

Ce que je voudrais, c'est trier mon Dict1 d'après la distance entre la localisation actuelle (appelons-la localisationCourrante) et la CLLocation "référence" de chaque Objet1, qui est en fait la CLLocation de Objet3 dans le 1er élément de Array2.

Pour calculer la distance entre 2 points, pas de problème, la méthode existe.

Par contre, je ne sais pas trop comment créer une méthode de tri:
- opérant d'abord le calcul de la distance pour chaque Objet1 entre localisationCourrante et CLLocation de l'Objet1
- et triant ensuite Dict1 d'après ces distances obtenues

La distance n'étant rien d'autre qu'un nombre, la comparaison n'est plus très compliquée... une fois ces distances calculées!

Ai-je été assez clair?
Auriez-vous des idées, suggestions, de simples pistes...?

Réponses

  • schlumschlum Membre
    11:50 modifié #2
    Rajoute une variable distance dans Objet 1 (que tu calcules soit au fur et à  mesure, soit toutes d'un coup).  ???
  • CéroceCéroce Membre, Modérateur
    11:50 modifié #3
    J'ai bien compris la hiérarchie des objets dans Dict1.
    Ce que je n'ai pas compris c'est "je veux trier Dict1". Par définition, on ne peut pas trier un dictionnaire.

    Puisque ça va t'être utile, un tri sous Cocoa se fait habituellement grâce à  un Sort Descriptor http://developer.apple.com/documentation/Cocoa/Conceptual/SortDescriptors

    Il te faudra une méthode pour comparer deux Objet1, à  refiler à  -[NSSortDescriptor  initWithKey:ascending:selector:].
  • 6ix6ix Membre
    11:50 modifié #4
    dans 1227293422:
    Ce que je n'ai pas compris c'est "je veux trier Dict1". Par définition, on ne peut pas trier un dictionnaire.


    Effectivement. En fait je le transforme en tableau d'abord en faisant [myDict1 allValues].

    dans 1227293422:

    Puisque ça va t'être utile, un tri sous Cocoa se fait habituellement grâce à  un Sort Descriptor http://developer.apple.com/documentation/Cocoa/Conceptual/SortDescriptors

    Il te faudra une méthode pour comparer deux Objet1, à  refiler à  -[NSSortDescriptor  initWithKey:ascending:selector:].


    Oui j'ai déjà  lu ce que je pouvais sur la façon de trier un tableau et les différentes manières de le faire.

    Première chose que j'ai remarqué: je ne peux pas créer un descriptor "tout simple", du style
    distanceDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES] autorelease];
    

    car je n'ai pas directement cet élément distance, je dois d'abord le calculer d'après une valeur que j'ai et une autre que je vais chercher dans la "hiérarchie" de mon Dict1.
    Une façon de faire serait comme dit schlum, à  savoir ajouter cette variable à  Objet1 après l'avoir calculée, de manière à  pouvoir créer un descriptor de la sorte.

    Deuxio, je me suis donc intéressé à  la possibilité d'effectuer un tri en passant en argument une méthode que l'on définit soi-même pour réaliser la comparaison. Problème ici, une telle méthode prend en argument 2 objets à  comparer, mais pas moyen de lui passer un argument "externe" qui serait ici ma localisation courante...

    Je vais donc tenter la méthode de schlum.
  • CéroceCéroce Membre, Modérateur
    11:50 modifié #5
    En effet, je n'avais pas assez poussé la réflexion. La comparaison est effectivement faà®te entre deux éléments d'un même tableau. De toute façon, pour des raisons de performances, tu as plutôt intérêt à  stocker les distances.
Connectez-vous ou Inscrivez-vous pour répondre.