Comment trier un tableau en fonction de la longueur de chaque élément?

96

J'ai un tableau comme celui-ci:

arr = []
arr[0] = "ab"
arr[1] = "abcdefgh"
arr[2] = "abcd"

Après le tri, le tableau de sortie doit être:

arr[0] = "abcdefgh"
arr[1] = "abcd"
arr[2] = "ab"  

Je veux dire, je veux dans l'ordre décroissant de la longueur de chaque élément.

ramesh kumar
la source
1
sortest assez simple, où rencontrez-vous des difficultés?
mu est trop court
4
@muistooshort bien par défaut sort () trie les chaînes par ordre alphabétique, il cherchait le tri string.length comme on peut le voir dans la réponse choisie :)
jave.web

Réponses:

232

Vous pouvez utiliser la Array.sortméthode pour trier le tableau. Une fonction de tri qui considère la longueur de la chaîne comme critère de tri peut être utilisée comme suit:

arr.sort(function(a, b){
  // ASC  -> a.length - b.length
  // DESC -> b.length - a.length
  return b.length - a.length;
});

Remarque: le tri ["a", "b", "c"]par longueur de chaîne n'est pas garanti ["a", "b", "c"]. Selon les spécifications :

Le tri n'est pas nécessairement stable (c'est-à-dire que les éléments qui se comparent égaux ne restent pas nécessairement dans leur ordre d'origine).

Si l'objectif est de trier par longueur, par ordre de dictionnaire, vous devez spécifier des critères supplémentaires:

["c", "a", "b"].sort(function(a, b) {
  return a.length - b.length || // sort by length, if equal then
         a.localeCompare(b);    // sort by dictionary order
});
Salman A
la source
J'ajouterais que cela trie le tableau en diminuant la longueur des éléments.
davidhq
aha c'est dans le commentaire :) ne l'ai pas vu au début
davidhq
Juste pour ajouter une information. Cet extrait de code ne fonctionnera pas pour tous les cas.
Arunkumar Srisailapathi
Essayez pour arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], il échouera
Arunkumar Srisailapathi
15
The ES6 wayarr.sort((a, b) => b.length - a.length)
Fergal
4

Nous pouvons utiliser la méthode Array.sort pour trier ce tableau.

Solution ES5

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

Pour l' ordre de tri croissant :a.length - b.length

Pour l' ordre de tri décroissant :b.length - a.length

Solution ES6

Attention: tous les navigateurs ne comprennent pas le code ES6!

Dans ES6, nous pouvons utiliser des expressions de fonction de flèche .

let array = ["ab", "abcdefgh", "abcd"];

array.sort((a, b) => b.length - a.length);

console.log(JSON.stringify(array, null, '\t'));

Bharata
la source
0

Sur la base de la réponse de Salman, j'ai écrit une petite fonction pour l'encapsuler:

function sortArrayByLength(arr, ascYN) {
        arr.sort(function (a, b) {           // sort array by length of text
            if (ascYN) return a.length - b.length;              // ASC -> a - b
            else return b.length - a.length;                    // DESC -> b - a
        });
    }

alors appelle-le avec

sortArrayByLength( myArray, true );

Notez que malheureusement, les fonctions ne peuvent / ne doivent pas être ajoutées au prototype Array, comme expliqué sur cette page .

De plus, il a modifié le tableau passé en paramètre et ne renvoie rien. Cela forcerait la duplication du tableau et ne serait pas génial pour les grands tableaux. Si quelqu'un a une meilleure idée, faites un commentaire!

Nico
la source
0

J'ai adapté la réponse de @ shareef pour la rendre concise. J'utilise,

.sort(function(arg1, arg2) { return arg1.length - arg2.length })


la source
cela trierait de la longueur basse à la longueur plus élevée
Miguel
0
#created a sorting function to sort by length of elements of list
def sort_len(a):
    num = len(a)
    d = {}
    i = 0
    while i<num:
        d[i] = len(a[i])
        i += 1
    b = list(d.values())
    b.sort()
    c = []
    for i in b:
        for j in range(num):
            if j in list(d.keys()):
                if d[j] == i:
                    c.append(a[j])
                    d.pop(j)
    return c
Rishabh Gupta
la source
1
Publier le code seul n'aidera pas. Décrivez brièvement ce que fait votre code.
coderpc le
-1

Ce code devrait faire l'affaire:

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));
Salut
la source
-3
<script>
         arr = []
         arr[0] = "ab"
         arr[1] = "abcdefgh"
         arr[2] = "sdfds"
         arr.sort(function(a,b){
            return a.length<b.length
         })
         document.write(arr)

</script>

La fonction anonyme que vous passez pour trier lui indique comment trier le tableau donné. c'est quoi faire

Scientifique fou
la source
5
Quelle est la fonction de comparaison de tri censée renvoyer? Voici un indice: ce n'est pas un booléen.
mu est trop court