Como classificar uma matriz com base no comprimento de cada elemento?


95

Eu tenho uma matriz como esta:

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

Após a classificação, a matriz de saída deve ser:

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

Quer dizer, eu quero na ordem decrescente do comprimento de cada elemento.


1
sorté bem direto, onde você está tendo dificuldade?
mu é muito curto

4
@muistooshort bem padrão sort () classifica as strings alfabeticamente, ele estava procurando pela classificação string.length como pode ser visto na resposta escolhida :)
jave.web

Respostas:


231

Você pode usar o Array.sortmétodo para classificar a matriz. Uma função de classificação que considera o comprimento da string como o critério de classificação pode ser usada da seguinte maneira:

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

Nota: a classificação ["a", "b", "c"]pelo comprimento da string não tem garantia de retorno ["a", "b", "c"]. De acordo com as especificações :

A classificação não é necessariamente estável (ou seja, os elementos que se comparam igual não permanecem necessariamente em sua ordem original).

Se o objetivo é classificar por comprimento, por ordem de dicionário, você deve especificar critérios adicionais:

["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
});

Eu acrescentaria que isso classifica a matriz diminuindo o comprimento dos itens.
davidhq

aha está no comentário :) não vi a princípio
davidhq

Apenas para adicionar uma informação. Este snippet não funcionará para todos os casos.
Arunkumar Srisailapathi de

Tente arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], vai falhar
Arunkumar Srisailapathi

15
A maneira ES6arr.sort((a, b) => b.length - a.length)
Fergal

4

Podemos usar o método Array.sort para classificar esse array.

Solução ES5

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

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

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

Para ordem de classificação crescente :a.length - b.length

Para ordem de classificação decrescente :b.length - a.length

Solução ES6

Atenção: nem todos os navegadores podem entender o código ES6!

No ES6, podemos usar expressões de função de seta .

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

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

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



0

Com base na resposta de Salman, escrevi uma pequena função para encapsulá-lo:

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
        });
    }

então é só ligar com

sortArrayByLength( myArray, true );

Observe que, infelizmente, funções podem / não devem ser adicionadas ao protótipo do Array, conforme explicado nesta página .

Além disso, ele modificou o array passado como parâmetro e não retorna nada. Isso forçaria a duplicação do array e não seria ótimo para arrays grandes. Se alguém tiver uma ideia melhor, por favor, comente!


0

Adaptei a resposta de @shareef para torná-la concisa. Eu uso,

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


isso classificaria de comprimento baixo para comprimento maior
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

1
Publicar o código sozinho não ajudará. Dê uma breve descrição do que seu código faz.
coderpc

-1

Este código deve fazer o truque:

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

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

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

-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>

A função anônima que você passa para classificar diz a ele como classificar o array fornecido. Espero que isso ajude. Sei que isso é confuso, mas você pode dizer à função de classificação como classificar os elementos do array passando-lhe uma função como um parâmetro informando é o que fazer


5
O que a função de comparação de classificação deve retornar? Aqui está uma dica: não é um booleano.
mu é muito curto
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.