tri et recherche dans un tableau

odjauodjau Membre
23:12 modifié dans API AppKit #1
Salut tout le monde,
je cherche un moyen de trier un tableau, et de trouver l'index d'un élément de ce tableau. Je n'ai pas trouvé (ou pas su utiliser les méthodes proposées par la classe NSMutableArray :-\\).

Pour le tri :
Dans mon cas, mon tableau contient des dictionnaires (une clé date et une clé "valeur") et je souhaite trier mon tableau dans un ordre chronologique (du plus ancien au plus récent).

Pour la recherche d'index :
Lors de l'ajout d'un élément dans mon tableau, je veux pouvoir trouver l'index des dictionnaire dont la date "entoure" l'élément à  ajouter afin de vérifier si la "valeur" associée à  la date est cohérente :why?:

ça fait 2 jours que je m'arrache les cheveux B) j'vais devenir complétement chauve :(

Merci d'avance

Réponses

  • 23:12 modifié #2
    Pour retrouver un objet dans un tableau, il y a indexOfObject:, qui prend comme argument l'objet dont tu veux connaitre l'index.

    Je vais expliquer la première, qui datent de l'aire NextStep, et laisser à  ClicCool (pour ne donner qu'un exemple) le soin d'expliquer la troisième, utilisée par les bindings ;)

    Pour ce qui est du tri c'est moins évident. il y a trois possibilité, soit les méthodes sortUsingSelector, qui prend un argument un sélecteur (@selector(NomMethode:)), qui est une méthode qui doit prendre un argument, qui est du type de l'objet à  trier (un dico dans ton cas). Cette méthode doit appartenir à  la classe de l'objet à  trier et renvoyer NSOrderedAscending, NSOrderedDescending, NSOrderedSame suivant le cas. Dans ton cas, pour utiliser cette solution, tu dois créer une catégorie de NSDico, et y rajouter la dite méthode. Le problème est que dans ce cas, tu mettres comme constante dans la méthode la clé, ce que je ne trouve pas très propre, mais ça fonctionne bien.

    Si ce sont des dates le code donne
    - (NSComparisonResult)compareDates:(NSDictionary *)anotherItem {<br />return [[self objectForKey:@&quot;date&quot;] compare:[anotherItem objectForKey:@&quot;date&quot;]];<br />}
    


    L'autre méthode est sortUsingFunction, mais je ne l'ai jamais utilisé.
  • odjauodjau Membre
    23:12 modifié #3
    Salut Renaud,
    j'ai essayé ta méthode, mais sans succès :(
    j'ai un warning : "multiple declarations for method `compare:'"
    J'ai du loupé une étape quelque part.

    Dans mon controleur j'ai implémenté :
    <br />[data sortedArrayUsingSelector:@selector(compareDates:)];<br />(data étant mon tableau de NSDictionary)<br />
    


    J'ai créé une catégorie dans laquelle j'ai le code suivant :
    <br />- (NSComparisonResult)compareDates:(NSDictionary *)anotherItem<br />{<br />return [[self objectForKey:@&quot;date&quot;] compare:[anotherItem objectForKey:@&quot;date&quot;]];<br />}<br />
    


    N'ayant jamais fais de catégorie auparavant, je pense que l'erreur peut se situer par la.
    J'ai tout de même vérifié avec le débugeur que ma catégorie était appelée autant de fois que j'ai d'élément dans mon tableau, c'est bien le cas, mais sans résultat sur l'ordre des éléments de mon tableau :-\\

    Si tu as une idée ::)
  • janvier 2005 modifié #4
    Non, l'erreur est normale, plusieurs classes déclarent cette méthode. J'ai oublié les NSDate dans le code que j'ai mis, ce qui donne:
    return [(NSDate*)[self objectForKey:@&quot;date&quot;] compare:(NSDate*)[anotherItem objectForKey:@&quot;date&quot;]];<br />
    

    Mais ça ne change rien au fonctionnement...

    J'avais supposé que tu stockais tes dates dans des NSDate. Si ce n'est pas le cas, tu fais comment? Si c'est des NSString, quel format as-tu choisi?

    Tu as bien fait un reloadData?
  • odjauodjau Membre
    23:12 modifié #5
    De mémoire,
    --> je stock bien des NSdate (enfin sauf erreur de ma part  :()
    --> je fais bien un reloaData (ça j'en suis sûr  ::))

    Je retourne sur mon problème dès ce soir  >:) (dur d'avancer quand le temps manque  ::))


    @ + , j'te tiens au courant
  • odjauodjau Membre
    23:12 modifié #6
    YES !!! :brule:
    ça marche. Merci Renaud.

    Le problème venait de l'implémentation du [data sortedArrayUsingSelector:@selector(compareDates:)]; qui ne rafraà®chissait pas correctement mes données.

    Encore merci, je m'attaque maintenant à  la vérification de la "cohérence" des élément ajouté au tableau >:) .

    @+
Connectez-vous ou Inscrivez-vous pour répondre.