[Résolu] Retrouver le chemin d'un objet dans des dictionnaires ?

MayerickMayerick Membre
juillet 2015 modifié dans Objective-C, Swift, C, C++ #1
Bonsoir à  tous,


J'ai un petit problème pour retrouver le chemin d'un objet au travers d'une série de dictionnaires. J'ai fais des recherches mais soit c'est pas possible, soit je n'ai pas les bons mots clés, donc si quelqu'un pouvait m'aider s'il vous plait.


Je vous détaille un peu le problème avec un peu de code :
// j'ai un dictionnaire qui contient d'autres dictionnaires pour chaque clé (qui me servent d'index)  et ainsi de suite.    NSMutableDictionary *firstDict = [NSMutableDictionary new];    [firstDict setObject:[NSMutableDictionary new] forKey:@"0"];    [[firstDict objectForKey:@"0"]setObject:[NSMutableDictionary new] forKey:@0.0];    [[[firstDict objectForKey:@"0"]objectForKey:@0.0]setObject:[NSMutableDictionary new] forKey:@0.0.0];        // A la fin je place mon custom object directement dans le dictionnaire ou dans un tableau car il peut y'en avoir plusieurs pour le même index    MyObject *object = [MyObject new]; // ....    NSArray *objectArray = [NSArray arrayWithObjects:object, nil];    [[[[firstDict objectForKey:@"0"]objectForKey:@0.0]objectForKey:@0.0.0]setObject:object/*(ou objectArray ça depend)*/ forKey:@object];// je garde une référence de cet objet pour le modifier si besoin dans la méthode suivante    lastObjectSelected = object;

Sachant que chaque custom object est unique et ne peut être que dans un dictionnaire précis à  la fois (je ne set donc jamais le même objet pour deux clés différentes ou dans deux dictionnaires différent), j'aimerais savoir s'il est possible de remonter le chemin des dictionnaires pour obtenir toutes les clés qui permettent d'arriver à  l'objet ? Ou alors s'il est possible d'accéder (même si je doute), au dictionnaire qui contient le dictionnaire qui contient le MyObject que je possède en référence ? Une sorte de "super.dictionnary" quoi.


Dans le cas du code au-dessus j'aimerai avoir en retour quelque chose comme un tableau de clé me permettant de remonter jusqu'à  la clé du dictionnaire "primaire" : @[@object, @0.0.0, @0.0, @"0"] lorsque je passe en argument lastObjectSelected.


Je sais que je pourrais y arriver avec des boucles successives sur chaque dictionnaire jusqu'à  trouver le bon objet et puis faire un break, mais je me doute que ce n'est pas la meilleure manière et ce n'est pas la moins gourmande en code non plus, de plus je préfèrerais utiliser une autre solution, sauf si c'est résolument la meilleure d'après vous, mais j'en doute.


J'ai pensé aussi utiliser des NSPredicate, mais dans le cas d'un chemin, j'avoue que je ne vois pas trop comment faire.


Toute aide est appréciée, merci beaucoup !

Réponses

  • A part ta boucle, je ne vois pas bien...


     


    Ceci dit, à  moins d'avoir un nombre considérable de valeurs, cela consomme peu de ressources.


  • jpimbertjpimbert Membre
    juillet 2015 modifié #3

    Tu pourrais :


    1/ construire le chemin sous forme de chaà®ne ou de tableau au moment où tu insères un objet dans la structure de dictionnaires


    2/ associer le chemin obtenu à  l'objet  (voir les associative objects dans le runtime Objective-C)


     


    Il s'agit d'utiliser le runtime Objective-C ; il est accessible aussi en Swift.


  • MayerickMayerick Membre
    juillet 2015 modifié #4
    Merci pour vos réponse !


    @Herve

    En effet une boucle peut largement le faire j'en ai conscience. J'aurais juste aimé m'économiser du code et des boucles à  l'intérieur d'autres boucles, car il peut y avoir "pas mal" d'objets, quelques centaines, s'il faut que je boucle sur des boucles j'ai peur qu'à  terme les perfs ne soient pas extra, mais je peux toujours commencé comme ça et changer après.


    @jpimbert

    1/ c'était mon idée première, mettre un attribut à  l'objet qui contient son chemin (soit sous forme de string, soit de tableau comme dans mon exemple), mais le problème est que l'objet est susceptible d'être transféré vers un autre dictionnaire ou vers une autre clé puis supprimé de son ancien dictionnaire ou clé, à  ce moment là  il faudrait que je modifie le chemin à  chaque fois dans l'objet, et c'est encore plus laborieux niveau code, car ça va me faire ajouter pas mal de code à  chaque fois que je déplace les objets, et c'est déjà  une partie assez rigoureuse, donc si je peux m'en passer je préfère. Après c'est vrai que pour le prix de quelques lignes de code dans les méthodes où je transfert les objets, je pourrais gagner en ressources, puisque je n'ai qu'à  changer le chemin de l'objet quand celui-ci change, et le reste du temps, je n'ai pas besoin de le retrouver. N'empêche que ça m'arrange pas des masses car je dois tout prendre en charge (je sais la vie est moche parfois ^^).


    2/ mais c'est vrai que l'attribut ne me plaisait pas des masses, ça semble pas trop propre. Par contre je ne connaissais pas les associatives objects, je vais cash regarder en quoi ça peut m'aider. Merci beaucoup !



    à‰dit : j'ai regardé les associatives objects, alors je ne pense pas que ce soit ce dont j'ai besoin. Si j'ai bien compris ça permet d'attribuer une constante à  un objet, malheureusement mon chemin n'est pas une constante. De plus j'ai peur de ne pas encore forcément comprendre tous les tenants et aboutissants de ce genre d'outil, aussi même si je sais qu'un jour ce serait bien de le maà®triser, pour l'instant je ne pense pas avoir la maturité nécessaire, sans la maà®trise la puissance n'est rien. ^^ Mais c'est toujours bon de découvrir ça et de pouvoir se renseigner petit a petit dessus, donc merci !
  • Joanna CarterJoanna Carter Membre, Modérateur
    Si tu n'utilises que les nombres entiers pour les clés, pouquoi pas utiliser les tableaux et NSIndexPath ?
  • Joanna CarterJoanna Carter Membre, Modérateur
    juillet 2015 modifié #6
    En plus, il y a une syntaxe plus moderne pour gérer les dictionnaires :

    NSMutableDictionary *firstDict = [NSMutableDictionary new];
    NSMutableDictionary *nextDictionary = [NSMutableDictionary new];
    firstDict["0"] = nextDictionary;
    NSMutableDictionary *lastDictionary = nextDictionary;
    nextDictionary = [NSMutableDictionary new];
    lastDictionary["0.0.0"] = nextDictionary;
    // ...
  • C'est vrai qu'une gestion de NSIndexPath peut être intéressante.


    Il y a aussi la possibilité d'avoir des clés de strings avec un format spécifique, qui ferait en sorte que la clé d'un sous-dictionnaire ait en début ait en début de sa clé le début de la clé parent:
    Cle1, Cle1séparateurSousCle1, et du coup, si tu as l'objet, il suffit de faire un componentsSeparatedByString:@séparateur


  • Merci Joanna Carter pour ta réponse.


    1/ En fait je vous ai simplifié le problème, je n'utilise pas que des nombres entiers en clé et les clés ne se suivent pas, on peut passer de la clé "0" à  "5.33", et enfin la dernière clé est un "descriptif" de l'objet, dans mon exemple je l'ai simplement appelé "objet", mais en vrai c'est "objetDeTypeA", "objetDeTypeB"... Donc malheureusement ça ne fonctionne pas avec des tableaux.


    2/ Merci pour ce rappel, j'utilise assez régulièrement cette syntaxe, mais elle ne parle pas forcément à  tout le monde, et même si "l'ancienne" manière est un peu longue, elle a le mérite d'être claire pour tous. Après c'est clair que dans le code en situation, c'est bien plus agréable à  lire.
  • MayerickMayerick Membre
    juillet 2015 modifié #9
    @Larme.


    Merci pour ta réponse.


    J'avais pensé à  une clé au format spécifique (typiquement des tirets : "objet-0.0.0-0.0-0") en tant qu'attribut de l'objet lui-même, avec un componentSeparatedByString ça aurait été easy, mais comme expliqué plus haut, la clé et/ou le dictionnaire est/sont susceptible(s) de changer, et j'aurais bien voulu m'économiser la prise en charge de ce changement, et aussi m'éviter de boucler sur tous les objets pour avoir quelque chose de dynamique. Mais y'a peut-être pas 50 solutions non plus je pense, je veux juste être sûr que je ne me prend pas le chou alors qu'une solution plus simple est possible.
  • Joanna CarterJoanna Carter Membre, Modérateur
    juillet 2015 modifié #10
    Encore une idée. Mettre les "clés composés" dans un dictionnaire avec les NSIndexPath comme valeurs, mais mettre les objets dans une hiérarchie de tableaux ?
  • Merci Joanna Carter pour ta réponse.


    Alors je pense pas que je vais faire ça même si je vois très bien la solution que tu proposes, car je suis déjà  à  un stade assez avancé et ça me ferait bouger tout mon data model et ça me plait pas trop. Je cherchais plutôt à  savoir si j'aurais pas oublié une solution évidente pour d'autres et qui aurait simplifiée le boulot. Je n'ai malheureusement pour le moment pas une semaine à  perdre pour une optimisation qui me ferait revoir en profondeur le code. Donc dans un premier temps comme il faut que j'avance dans les fonctions de l'app, je vais faire des boucles, puis quand ce sera fini je gèrerai un attribut sur l'objet que je modifierai à  chaque fois que nécessaire, ça reste faisable a mon niveau, s'intègre parfaitement dans mon data model et me fera déjà  économiser pas mal de ressource quand le besoin sera présent.


    Pour les NStreeNode, pareil je connaissais pas, j'ai checké et ça à  l'air pas mal, mais j'ai peur de ne pas pouvoir maà®triser le truc rapidement car j'ai pas trouvé des masses de trucs frais étant très explicites. Donc comme les associatives objects, ça reste dans un coin de ma tête et dès que je peux en apprendre plus dessus je fonce ! :)


    Du coup comme je le disais dans mon premier message, je me doutais qu'il n'y avait pas de manière simple et native de remonter le chemin d'un objet dans une suite de dictionnaires, je voulais simplement en avoir le coe“ur net. Je pense donc que je peux classer ce sujet comme résolu !


    Vraiment merci beaucoup à  tous pour vos interventions !
Connectez-vous ou Inscrivez-vous pour répondre.