Tri en sens descending dans un simple Array ?

Eddy58Eddy58 Membre
14:24 modifié dans API AppKit #1
J'ai un simple array avec des strings dedans, j'utilise la méthode de tri sortedArrayUsingSelector mais, curieusement, le tri n'est proposé qu'en mode ascending, hors j'ai aussi besoin du descending, comment faire ? ???

[tt]
resultArray=[monArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
[/tt]

Réponses

  • ChachaChacha Membre
    juillet 2005 modifié #2
    C'est le sélector que tu donnes qui est censé définir l'ordre. Or, caseInsensitiveCompare trie en ordre croissant sans possibilité de personnaliser ça.

    Donc de trois choses l'une :
      -soit tu tries puis tu renverses ton tableau
      -soit tu écris un nouveau sélector qui fait un caseInsensitiveCompare et inverse les resultats (par exemple dans une catégorie de NSString) :
      -soit tu utilises le tri par NSSortDescriptor, mais dans ce cas je ne vois pas trop comment faire (je saurais avec un tableau de dicos, mais pas un tableau de chaà®nes)

    Pour ceux qui veulent découvrir les "catégories" en Objective-C, voici l'exemple de la solution 2 :

    <br />@interface NSString  (ExtensionPerso)<br />-(NSComparisonResult) reverseCaseInsensitiveCompare:(NSString*)string;<br />@end<br /><br />@implementation NSString  (ExtensionPerso)<br />-(NSComparisonResult) reverseCaseInsensitiveCompare:(NSString*)string<br />{<br />&nbsp; [edit]//version chacha, moche<br />  NSComparisonResult result = [self caseInsensitiveCompare:string];<br />  return (result == NSOrderedAscending) ? NSOrderedDescending : (result == NSOrderedDescending) ? NSOrderedAscending : result;<br />&nbsp; [/edit]<br />&nbsp; [edit]//version Renaud, magnifique<br />&nbsp; return [string caseInsensitiveCompare:self];<br />&nbsp; [/edit]<br />}<br />@end<br />
    


    +
    Chacha

    [edit]
    Pour la solution 3 :
    <br />NSSortDescriptor* descriptor = [[[NSSortDescriptor alloc] initWithKey:@&quot;self&quot; ascending:NO selector:@selector(caseInsensitiveCompare:)] autorelease];<br />resultArray = [monArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];<br />
    

    [/edit]
  • juillet 2005 modifié #3
    dans 1120659387:

    -soit tu utilises le tri par NSSortDescriptor, mais dans ce cas je ne vois pas trop comment faire (je saurais avec un tableau de dicos, mais pas un tableau de chaà®nes)


    Ce n'est pas en effet pas possible, car pour utiliser les NSSortDescriptor, la classe des objets à  trier doit être KVC (enfin, pas tout à  fait, la seule méthode utilisée est -valueForKey:), et ce n'est pas le cas de NSString.
    [EDIT] Je retire ce que j'ai dit, bien joué Chacha ;) (oups un smiley)

    Juste un petit détail, [tt]NSOrderdAscending[/tt], [tt]NSOrderedSame[/tt] et [tt]NSOrderedDescending[/tt] valent respectivement -1, 0 et 1. Il est donc possible de simplifier ton code comme suit:
    [tt]return -1*[self caseInsensitiveCompare:string];[/tt]
  • ChachaChacha Membre
    juillet 2005 modifié #4
    dans 1120660616:

    Ce n'est pas en effet pas possible, car pour utiliser les NSSortDescriptor, la classe des objets à  trier doit être KVC (enfin, pas tout à  fait, la seule méthode utilisée est -valueForKey:), et ce n'est pas le cas de NSString.

    Si si, j'ai réussi, regarde dans le [edit][/edit] l'astuce dont je ne suis pas peu fier !
    [EDIT]
    Ah ben tiens, on s'envoie des [edit] de partout, on dirait ;)
    [/EDIT]


    Juste un petit détail, [tt]NSOrderdAscending[/tt], [tt]NSOrderedSame[/tt] et [tt]NSOrderedDescending[/tt] valent respectivement -1, 0 et 1. Il est donc possible de simplifier ton code comme suit:
    [tt]return -1*[self caseInsensitiveCompare:string];[/tt]

    Honnêtement, je préfère que le compilo m'optimise ça. Non seulement il trouvera la forme qui ira le plus vite, mais en plus on est peinard si les valeurs changent un jour. Mais oui, ta formule est (largement) plus simple à  écrire.

    +
    Chacha

    [edit]Allez, j'augmente la difficulté du concours[/edit]
    [edit Renaud]ça ne se fait pas de brouiller les pistes comme ça...[/edit Renaud]
    [edit]Pour départager les gens, sur la fin... non ?[/edit]
  • juillet 2005 modifié #5
    Le compilo est donc si "intelligent" que ça? Mon problème est que ne connaissant pas les limites de son intelligence, je ne préfère pas lui en attribuer, en fait.

    Bon de toute façon, il y a encore plus simple:
    [tt]return [string caseInsensitiveCompare:self];[/tt]
  • ChachaChacha Membre
    juillet 2005 modifié #6
    dans 1120661530:

    Le compilo est donc si "intelligent" que ça?

    Je pense réellement que oui (et d'après la suite, il est même plus intelligent que moi :)


    Bon de toute façon, il y a encore plus simple:
    [tt]return [string caseInsensitiveCompare:self];[/tt]

    Euh... alors là  chapeau ! Oui, ça me paraà®t la bonne façon. Je vais de suite corriger mon premier post. C'est bien, de réfléchir à  plusieurs, quand même !
    +
    Chacha

    [edit]Allez, j'augmente la difficulté du concours[/edit]
  • juillet 2005 modifié #7
    Bon, j'offre une bouteille de Cantillon à  celui qui arrivera à  me retracer "l'historique" de ce sujet. (Non Chacha, tu n'es pas éligible au concours...)

    [edit]Avant de penser à  départager les gens, il faut d'abord des candidatures :p[/edit]
  • Eddy58Eddy58 Membre
    14:24 modifié #8
    Merci les gars. En effet un peu mouvementé ce post.:P
    Le coup de la catégorie, super, je pensais l'implémenter, mais j'ai vu que Chacha a trouvé le truc avec NSSortDescriptor (bien vu le "self" en key !!), et ça marche impeccable, en plus ça sert pour les deux sens de tri. :)
  • Très instructif. 


  • çà  c'est du déterrage !!!  ;D


  • La magie de la fonction recherche.  :P


  • sophiewcy1991sophiewcy1991 Membre
    octobre 2014 modifié #12

     Ah, Dieu, je suis le pire mathématiques, maths et je l'ai mal à  la tête, je ne peux pas vous aider.  B)


     


     


     


     


     


     


     



  • Pour un premier post, tu fais fort ! C'est pour dire çà  que tu re-déterre ce vieux post ?!  ???


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