Pular para a ferramenta
makeshortwork.com Ordenador de Texto
EN

Ordenador de Texto e Lista

Cole uma lista e ordene do jeito que você realmente quis dizer. Ordem alfabética com regra de idioma, ordem natural de números, remoção de repetidas — tudo nesta aba.

Por que quase todo ordenador erra a ordem alfabética

Peça a uma linguagem de programação para ordenar uma lista e ela vai comparar as strings pelo código dos caracteres. É rápido, é previsível, e quase nunca é o que uma pessoa quer dizer com "ordem alfabética".

No Unicode, toda letra latina maiúscula tem código menor que toda minúscula. Então uma ordenação bruta produz:

Ordem por code pointO que você quis dizer
AbacaxiAbacaxi
Zebraabacaxi
abacaxiZebra
zebrazebra
ÁpiceÁpice (perto de Abacaxi)

Toda palavra iniciada em maiúscula sobe para o topo, e as acentuadas caem depois do Z porque o code point delas fica num bloco posterior. As duas coisas estão erradas em qualquer idioma que use acento.

Esta ferramenta usa o Intl.Collator, a implementação nativa do navegador do algoritmo de colação do Unicode. Ele sabe que á fica ao lado de a, e sabe que a regra muda conforme o idioma — que é a parte que a maioria das ferramentas simplesmente ignora.

Ordem alfabética não é universal

As mesmas letras ordenam diferente conforme o idioma, e as duas ordens estão certas:

É por isso que existe um seletor de idioma. Escolha a língua em que a lista está escrita e a ordem passa a ser a que um leitor nativo espera.

Ordem natural: item2 antes de item10

A comparação alfabética anda caractere a caractere. Comparando item10 com item2, ela chega no 1 contra o 2, decide que 1 vem primeiro, e para. Você recebe item1, item10, item11, item2 — tecnicamente correto e praticamente inútil.

A ordem natural trata uma sequência de dígitos como um número só, então 2 < 10 como qualquer pessoa espera. Use em nome de arquivo, título de capítulo, versão, número de nota fiscal e qualquer coisa com contador. Funciona com dígitos em qualquer posição da linha, não só no fim.

Ordenação por valor numérico

A ordem numérica é outra coisa: ela acha o primeiro número em qualquer posição da linha e ordena por esse valor, ignorando o texto ao redor. Capítulo 12 fica depois de Capítulo 9, e Receita: 1.250 ordena por 1250.

Linha sem número nenhum vai para o fim, em vez de ser tratada como zero. Tratar como zero espalharia seus títulos e linhas em branco no meio da faixa numérica, o que confunde e é difícil de perceber.

Remover repetidas, inclusive as invisíveis

Duas linhas idênticas na tela às vezes são diferentes na memória. O Unicode consegue representar um caractere acentuado de dois jeitos: como um caractere pré-composto, ou como a letra base seguida de um acento combinante. Os dois aparecem como á. A comparação por bytes diz que diferem, então a repetida sobrevive e ninguém entende por quê.

Nós normalizamos toda linha para Unicode NFC antes de comparar, o que reduz as duas grafias à mesma forma. Junto com a opção de aparar — espaço no fim é a outra diferença invisível — isso pega repetidas que um Set comum deixaria passar.

A remoção mantém a primeira ocorrência, então se você ordenar depois o resultado é estável, e se mantiver a ordem original a entrada mais antiga vence.

Ordenação por tamanho

A ordenação por tamanho conta caracteres, não bytes, e conta do jeito que uma pessoa contaria. Um emoji, uma letra acentuada e um ideograma chinês contam um cada, ainda que ocupem dois, um e um code unit UTF-16 respectivamente. Linhas de mesmo tamanho caem para a ordem alfabética, então o resultado é determinístico em vez de depender da ordem de entrada.

Serve para achar exceção: ordene decrescente para revelar a linha estourada numa coluna de CSV, ou crescente para localizar os registros truncados num export.

Embaralhamento, feito direito

Ordem aleatória serve para sortear ganhador, randomizar quiz ou definir ordem de apresentação. O atalho que todo mundo usa — array.sort(() => Math.random() - 0.5) — não é um embaralhamento justo. Ele entrega um comparador inconsistente a um algoritmo que assume consistência, e o resultado é comprovadamente enviesado: os itens tendem a ficar perto de onde estavam.

Usamos Fisher-Yates, que percorre a lista de trás para frente trocando cada item por um anterior sorteado. Toda arrumação possível tem a mesma chance, que é o que "aleatório" deveria significar.

A ordem em que as opções são aplicadas

As opções interagem, e a sequência muda o resultado. Esta ferramenta sempre aplica na mesma ordem, para a saída ser previsível:

  1. Aparar — os espaços das duas pontas de cada linha saem primeiro, para as etapas seguintes compararem o conteúdo real e não espaço acidental.
  2. Remover linhas vazias — depois de aparar, então uma linha só com espaços conta como vazia.
  3. Remover repetidas — antes de ordenar, mantendo a primeira ocorrência, então a sobrevivente é a mais antiga da sua lista original.
  4. Ordenar — no que sobrou.
  5. Inverter — decrescente é aplicado por último, como uma virada da ordem já pronta.

A ordem importa mais no caso das repetidas. Remover antes de ordenar significa "mantenha a primeira que eu escrevi". Remover depois significaria "mantenha a que por acaso ordenou primeiro", que não é o que ninguém pretende.

O que esta ferramenta não faz

Ela ordena linhas inteiras. Se o seu dado é uma tabela delimitada e você precisa ordenar pela terceira coluna, o formato da ferramenta está errado — converta para JSON antes, ou use uma planilha. Quebrar por delimitador aqui seria pouco confiável pelas mesmas razões que fazem existir um parser de CSV de verdade: campo entre aspas pode conter o delimitador.

Ela também não ordena por data. String de data ordena certo por acidente quando está escrita como AAAA-MM-DD, porque esse formato calha de ser alfabeticamente ordenado — uma das razões de a ISO 8601 tê-lo escolhido. Qualquer outro formato (DD/MM/AAAA, "3 de março") vai ordenar numa sequência sem sentido, e nenhuma opção daqui conserta.

Privacidade e limites

Toda operação é uma operação de string rodando nesta aba. Nada é enviado, nada é registrado e não existe cadastro — o que importa porque lista colada em ordenador costuma ser e-mail, nome de cliente ou inventário interno. O limite prático é a memória da aba; listas de centenas de milhares de linhas ordenam sem problema.

Perguntas frequentes

Por que minha lista ordena diferente aqui e na planilha?

Porque ordenamos pelas regras do idioma, não pelo código do caractere. Uma ordenação bruta por code point coloca toda letra maiúscula antes de toda minúscula, então Zebra vem antes de abacaxi, e joga as acentuadas depois do Z. Esta ferramenta usa o Intl.Collator do navegador com o idioma que você escolher, que é a mesma lógica de um dicionário. Planilha faz algo parecido, e é por isso que agora os resultados batem.

Como faço item2 vir antes de item10?

Escolha ordem Natural. A ordem alfabética compara caractere a caractere, então o 1 de item10 vem antes do 2 de item2. A ordem natural lê sequências de dígitos como número e devolve item1, item2, item10 — que é o que se espera de nome de arquivo, capítulo e versão.

Meu texto é enviado para algum lugar?

Não. Tudo roda no seu navegador como operação de string. Nada é enviado, nada é armazenado e não existe cadastro. Você pode desconectar da internet que continua funcionando.

Por que duas linhas idênticas não são tratadas como repetidas?

Provavelmente elas diferem no nível dos bytes. Uma letra acentuada pode ser guardada como um caractere único ou como a letra simples seguida de um acento combinante — visualmente iguais, tecnicamente diferentes. Nós normalizamos para Unicode NFC antes de comparar, então essas agora casam. Linhas que ainda diferem têm diferença real, normalmente um espaço no fim, que a opção de aparar remove.

O embaralhamento é realmente aleatório?

É. Usa Fisher-Yates, em que toda arrumação possível tem a mesma chance. A gambiarra popular de ordenar com comparador aleatório é comprovadamente enviesada e tende a deixar os itens perto da posição original, então não usamos.