Descrição Overview Descripción
Ordenar uma lista de texto parece simples até o momento em que você se pergunta: café vem antes ou depois de caro? Em português, a resposta depende das regras de colação do locale — e elas são mais complicadas do que parecem. A especificação Unicode inclui o DUCET (Default Unicode Collation Element Table), uma tabela de mais de 7.000 entradas que define o peso de cada caractere para fins de ordenação em múltiplos idiomas.
O problema prático surge ao ordenar strings com acentos ou caracteres especiais. A ordenação lexicográfica pura por código Unicode coloca o é depois do z, o que não faz sentido em nenhum idioma humano. A solução correta é usar localeCompare com o locale e as opções de sensibilidade adequados. Na web, a Intl.Collator API padronizada pelo ECMAScript cuida disso — e faz a diferença entre uma lista que parece certa para o usuário e uma que parece quebrada.
Os algoritmos de ordenação têm uma história rica. A bubble sort é a mais famosa para fins didáticos e a menos usada em produção. O quicksort, proposto por Tony Hoare em 1959, dominou décadas por sua performance média de O(n log n). O timsort, criado por Tim Peters em 2002 para o Python e depois adotado pelo Java e pelo motor V8 do JavaScript, combina merge sort com insertion sort e aproveita sequências já ordenadas nos dados — uma genialidade prática. A propriedade de estabilidade — linhas com o mesmo valor mantendo a ordem relativa original — importa quando se ordena por múltiplos critérios em passagens separadas.
Sorting a text list sounds simple until you ask yourself: does café come before or after caret? The answer depends on the locale collation rules — and they are more complicated than they appear. The Unicode specification includes the DUCET (Default Unicode Collation Element Table), a table of over 7,000 entries that defines the weight of each character for sorting purposes across multiple languages.
The practical problem surfaces when sorting strings that contain accents or special characters. Pure lexicographic sorting by Unicode code point places é after z, which makes no sense in any human language. The correct solution is to use localeCompare with the appropriate locale and sensitivity options. On the web, the Intl.Collator API standardized by ECMAScript handles this — and it makes the difference between a list that feels right to the user and one that feels broken.
Sorting algorithms have a rich history. Bubble sort is the most famous for teaching purposes and the least used in production. Quicksort, proposed by Tony Hoare in 1959, dominated decades with its average O(n log n) performance. Timsort, created by Tim Peters in 2002 for Python and later adopted by Java and the V8 JavaScript engine, combines merge sort with insertion sort and exploits already-sorted runs in the data — a piece of practical genius. The stability property — lines with equal values keeping their original relative order — matters when sorting by multiple criteria in separate passes.
Ordenar una lista de texto parece sencillo hasta que te preguntas: ¿va café antes o después de carro? La respuesta depende de las reglas de cotejo del locale, y son más complicadas de lo que parecen. La especificación Unicode incluye el DUCET (Default Unicode Collation Element Table), una tabla de más de 7.000 entradas que define el peso de cada carácter para la ordenación en múltiples idiomas.
El problema práctico surge al ordenar cadenas con tildes o caracteres especiales. La ordenación lexicográfica pura por código Unicode sitúa la é después de la z, lo que no tiene sentido en ningún idioma humano. La solución correcta es usar localeCompare con el locale y las opciones de sensibilidad adecuadas. En la web, la API Intl.Collator, estandarizada por ECMAScript, se encarga de esto: marca la diferencia entre una lista que parece correcta al usuario y una que parece rota.
Los algoritmos de ordenación tienen una historia rica. Bubble sort es el más famoso para fines didácticos y el menos usado en producción. Quicksort, propuesto por Tony Hoare en 1959, dominó décadas con su rendimiento medio de O(n log n). Timsort, creado por Tim Peters en 2002 para Python y adoptado más tarde por Java y el motor V8 de JavaScript, combina merge sort con insertion sort y aprovecha las secuencias ya ordenadas en los datos, una genialidad práctica. La propiedad de estabilidad — que las líneas con el mismo valor mantengan su orden relativo original — importa cuando se ordena por múltiples criterios en pasadas separadas.
Detalhamento técnico
Ordenação e acentuação: o problema que ninguém percebe até errar
- Usar sort() nativo do JavaScript sem localeCompare coloca 'é' depois de 'z' porque compara por valores Unicode, não por regras de idioma. Em uma lista de produtos ou nomes em português, o resultado parece completamente quebrado.
- O Intl.Collator com locale 'pt-BR' lida corretamente com ã, ç, ê, ó e todos os outros caracteres do português brasileiro, usando as regras de colação definidas pelo Unicode CLDR.
- A sensibilidade de acentuação (sensitivity: 'base' vs 'accent') determina se 'e' e 'é' são considerados iguais para fins de comparação ou tratados como letras distintas.
- A ordenação natural (natural sort) interpreta números dentro de strings como valores numéricos: item10 vem depois de item9, não antes. Isso requer a opção numeric: true no Intl.Collator.
Casos de uso práticos
- Alfabetizar listas de nomes, países, cidades e produtos antes de exibir para o usuário final ou incluir em documentos.
- Ordenar chaves de arquivos de tradução (i18n) para facilitar a revisão e evitar duplicatas ocultas em arquivos YAML ou JSON.
- Organizar imports em arquivos de código de forma consistente, reduzindo ruído em code reviews.
- Preparar dados textuais antes de aplicar busca binária, que exige que a lista esteja ordenada.
- Ordenar linhas de um CSV por uma coluna específica antes de comparar com outra versão do arquivo.
Technical deep dive
Sorting and accents: the problem nobody notices until it breaks
- Using JavaScript's native sort() without localeCompare places 'é' after 'z' because it compares by Unicode values, not by language rules. In a product or name list, the result looks completely broken.
- Intl.Collator with the correct locale handles accented characters properly using collation rules defined by the Unicode CLDR.
- Accent sensitivity (sensitivity: 'base' vs 'accent') determines whether 'e' and 'é' are considered equal for comparison purposes or treated as distinct letters.
- Natural sort interprets numbers inside strings as numeric values: item10 comes after item9, not before. This requires the numeric: true option in Intl.Collator.
Practical use cases
- Alphabetizing lists of names, countries, cities, and products before displaying to end users or including in documents.
- Sorting keys in translation files (i18n) to make review easier and avoid hidden duplicates in YAML or JSON files.
- Organizing imports in code files consistently, reducing noise in code reviews.
- Preparing text data before applying binary search, which requires the list to be sorted.
- Sorting CSV lines by a specific column before comparing against another version of the file.
Detalle técnico
Ordenación y acentos: el problema que nadie nota hasta que falla
- Usar el sort() nativo de JavaScript sin localeCompare sitúa la 'é' después de la 'z' porque compara por valores Unicode, no por reglas de idioma. En una lista de productos o nombres en español, el resultado parece completamente roto.
- Intl.Collator con el locale correcto maneja correctamente las letras acentuadas, la ñ y otros caracteres del español usando las reglas de cotejo definidas por el Unicode CLDR.
- La sensibilidad a los acentos (sensitivity: 'base' frente a 'accent') determina si 'e' y 'é' se consideran iguales a efectos de comparación o se tratan como letras distintas.
- La ordenación natural interpreta los números dentro de las cadenas como valores numéricos: item10 va después de item9, no antes. Esto requiere la opción numeric: true en Intl.Collator.
Casos de uso prácticos
- Alfabetizar listas de nombres, países, ciudades y productos antes de mostrarlos al usuario final o incluirlos en documentos.
- Ordenar las claves de archivos de traducción (i18n) para facilitar la revisión y evitar duplicados ocultos en archivos YAML o JSON.
- Organizar los imports en archivos de código de forma consistente, reduciendo el ruido en las revisiones de código.
- Preparar datos textuales antes de aplicar búsqueda binaria, que requiere que la lista esté ordenada.
- Ordenar las líneas de un CSV por una columna específica antes de compararlo con otra versión del archivo.
Guia da ferramenta Tool guide Guía de la herramienta
-
O objeto tratado Texto dividido em linhas.
-
O que a ferramenta faz Ordena linhas alfabeticamente (A→Z ou Z→A), com opções de sensibilidade a maiúsculas e trim na chave de ordenação. Ordenação estável.
-
Por que usar Organizar listas, comparar visualmente conjuntos, preparar arquivos para diff mais limpo.
-
What you are working with Text split into lines.
-
What the tool does Sorts lines alphabetically (A→Z or Z→A), with case and trim options for the sort key. Stable sort.
-
Why use it Organise lists, compare sets visually, prepare files for cleaner diffs.
-
Con qué trabajas Texto dividido en líneas.
-
Qué hace la herramienta Ordena líneas alfabéticamente (A→Z o Z→A), con opciones de mayúsculas y recorte para la clave de ordenación. Orden estable.
-
Por qué usarla Organizar listas, comparar conjuntos visualmente, preparar archivos para diffs más limpios.
Exemplo de Código Code Snippets Fragmentos de Código
// Ordenação correta para português brasileiro
const linhas = text.split('\n').filter(Boolean);
linhas.sort((a, b) =>
a.localeCompare(b, 'pt-BR', { sensitivity: 'variant', numeric: true })
);
const resultado = linhas.join('\n');
linhas.sort((a, b) =>
b.localeCompare(a, 'pt-BR', { sensitivity: 'variant' })
);
const lines = text.split('\n').filter(Boolean);
lines.sort((a, b) =>
a.localeCompare(b, 'en-US', { sensitivity: 'variant', numeric: true })
);
const result = lines.join('\n');
lines.sort((a, b) =>
b.localeCompare(a, 'en-US', { sensitivity: 'variant' })
);
const lineas = text.split('\n').filter(Boolean);
lineas.sort((a, b) =>
a.localeCompare(b, 'es-ES', { sensitivity: 'variant', numeric: true })
);
const resultado = lineas.join('\n');
lineas.sort((a, b) =>
b.localeCompare(a, 'es-ES', { sensitivity: 'variant' })
);
Entrada Input Entrada
banana
apple
cherry → apple
banana
cherry
Perguntas frequentes FAQ Preguntas frecuentes
Para que serve esta ferramenta?
What is this tool for?
¿Para qué sirve esta herramienta?
Ela roda 100% no seu navegador: útil para validar, formatar ou converter dados no dia a dia de desenvolvimento.
It runs fully in your browser: useful to validate, format, or convert data in everyday development.
Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.
Meus dados são enviados a algum servidor?
Are my inputs sent to a server?
¿Se envían mis datos a algún servidor?
O processamento é feito localmente via JavaScript. Não armazenamos o conteúdo que você cola nas caixas de texto.
Processing happens locally with JavaScript. We do not store what you paste into the text areas.
El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.
Posso usar em produção ou para dados reais?
Can I use this for real production data?
¿Puedo usarlo con datos reales en producción?
Use por sua conta e risco. Para segredos (senhas, tokens), prefira ambientes controlados e políticas da sua empresa. E lembre sempre de revisar os conteúdos gerados. Nunca confie cegamente nas coisas que vê na internet.
Use at your own risk. For secrets (passwords, tokens), prefer controlled environments and your company policies. And always review the generated contents. Never trust blindly things you see on the internet.
Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.