Forums Développement Multimédia

Aller au contenu

Array.sort() et ordre alphabétique !

CODE Actionscript

4 réponses à ce sujet

#1 alpseb

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 146 messages

Posté 18 September 2012 - 14:34 PM

Hello, j'ai un problème à la con sur un tri alphabétique dans un array


var a:Array = ["Marémotrice","Méthanisation","énergie renouvelabl","énergies fossiles","Engrenage"];
trace(a.sort())
//Engrenage,Marémotrice,Méthanisation,énergie renouvelabl,énergies fossiles
trace(a.sort(Array.CASEINSENSITIVE));
//Engrenage,Marémotrice,Méthanisation,énergie renouvelabl,énergies fossiles
 

en gros les "é" passent apres les xyz sur le sort...
vous avez une idée de comment corriger ça ?

merci d'avance !

#2 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 18 September 2012 - 14:41 PM

Les accents ne sont pas gérés, tu vas devoir créer une fonction de tri personnalisé.

Array.sort(maFonction)

Haoooooooooooooooooooooooooooooooooooooooooooooou !!!

#3 hu9o

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 07 October 2012 - 18:58 PM

Pas certain que ce soit la manière la plus efficace, mais je te propose ça :


var a:Array = ["Marémotrice","Méthanisation","énergie renouvelabl","énergies fossiles","Engrenage"];
trace(a.sort())
//Engrenage,Marémotrice,Méthanisation,énergie renouvelabl,énergies fossiles
trace(a.sort(accSort));
//énergie renouvelabl,énergies fossiles,Engrenage,Marémotrice,Méthanisation


const accents = "áäčďéěíĺľňóôöŕšťúůüýřžáäČĎéĚíĹĽŇóôöŔšŤúŮüýŘŽ";
const ascii =   "aacdeeillnooorstuuuyrzAACDEEILLNOOORSTUUUYRZ";

function accSort(a:String, b:String):int
{
       
        for (var i:int=0; i<accents.length; i++)
        {
                a = a.split(accents.charAt(i)).join(ascii.charAt(i)).toLowerCase();
                b = b.split(accents.charAt(i)).join(ascii.charAt(i)).toLowerCase();
        }
       
        return (a > b )? 1 : -1;
}
 

Ca me semble être clair et aller droit au but, en utilisant une fonction de tri personnalisée.

Tu peux encapsuler la fonction avec les tableaux, histoire que ce soit plus propre.
Pas osé les déclaré dans la fonction, je crois que AS3 les aurait recréés à chaque appel...

Si tu es préoccupé par les performances, fais nous un petit benchmark, on verra ce que ça vaut...

#4 sebastien.portebois

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 3876 messages

Posté 08 October 2012 - 03:59 AM

Salut !

La question du tri par ordre alphabétique va en fait beaucoup plus loin que la simple gestion des diacritiques (accents, cédilles), car la gestion des mots composés arrive aussi : trie-t-on sur le premier mot, quel poids donner aux espaces, ...

Et là il faut alors voir
- le tri doit il être très exact (mais lent)
- peut il être précalculé (et on charge le cache local/serveur de la verison indexée)
-...

Anecdote qui ilustre la complexité derrière la question du tri alphabétique : l'ordre albaphabétique n'est pas le même pour les noms propres et les noms composés ;)

Mais pour donner un réel bout de solution constructive, je t'invite à lire ce vieux résumé que j'avais fait avec code et exemples, qui mélange flash (d'époque) et Lingo... amis le principe reste très compréhensible et facilement adaptable à une syntaxe et un langage plus moderne:
http://forums.mediab...__fromsearch__1

Et surtout pour être plus efficace, depuis Flash 10.1 il y a le package flash.globalization dans lequel tu trouveras des classes Collator (et CollatorMode.SORTING) qui sont fait pour faire des tris (et comparaison) en tenant compte des locales
Plus d'infos et un petit exemple dans la référence AS3 : http://help.adobe.co...n/Collator.html

Bonne journée,

Séb

#5 hu9o

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 08 October 2012 - 09:50 AM

Préférable à ma méthode "bricolée"... Merci pour l'info !

J'ai testé le Collator, ça concorde bien avec ce qu'on lit sur http://www-clips.ima...u-francais.html.

Juste un truc:
var sortingCollator:Collator = new Collator("fr-FR", CollatorMode.SORTING);
var words:Array = new Array("vice-consul", "vicennal", "vice-président", "vice-roi", "vicésimal", "vice versa", "vice-versa");
words.sort(sortingCollator.compare);
trace(words);
Ici "vice versa" se retrouve premier, alors qu'il est censé être sixième (la liste est déjà triée).

Mais à ce niveau c'est vraiment un détail pour moi...



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)