Ordenador de Linhas e Removedor de Duplicados

Ordene linhas de texto de A a Z ou de Z a A, remova linhas duplicadas e em branco, e corrija a ordem numérica natural para que item2 apareça antes de item10 — tudo instantaneamente no navegador.

219 visualizações

Por Que "item10" Aparece Antes de "item2" numa Ordenação Alfabética Simples

Uma ordenação padrão — o tipo por trás do método Array.sort() em JavaScript ou do botão A→Z numa folha de cálculo — compara duas linhas carácter a carácter, da esquerda para a direita, usando o ponto de código Unicode de cada carácter. Não interpreta uma sequência de dígitos como um número inteiro; apenas verifica se um carácter é menor ou maior que outro, uma posição de cada vez. É por isso que uma lista contendo item1, item2, item9, item10 e item20 é ordenada, carácter a carácter, como item1, item10, item2, item20, item9: ao comparar "item10" e "item2" letra a letra, as sequências são idênticas até "item", e o carácter seguinte decide tudo — "1" contra "2". Como o carácter "1" é menor que o carácter "2", item10 fica antes de item2, mesmo que dez seja numericamente maior que dois. Qualquer lista em que apareçam números dentro de texto sofre deste problema: números de versão, nomes de ficheiros como image2.jpg e image10.jpg, números de fatura e instruções passo a passo.

A ordenação natural — também chamada ordenação numérica — resolve isto reconhecendo uma sequência de dígitos consecutivos como um único número e comparando o seu valor em vez de comparar os dígitos um carácter de cada vez. A opção de ordenação natural desta ferramenta delega essa lógica à API Intl integrada no navegador, executando a.localeCompare(b, undefined, {numeric: true, sensitivity: "base"}) em cada par de linhas. A flag numeric:true diz à comparação para detetar sequências de dígitos e tratá-las como números, para que item2 fique corretamente antes de item10, e item9 antes de item20 — a ordem que uma pessoa a ler a lista esperaria, não a ordem que uma comparação carácter a carácter produz.

Comparação Sensível ao Idioma, Não Apenas Códigos de Carácter

A ordem alfabética também depende das regras do idioma que são aplicadas, e é aqui que uma comparação simples falha mesmo sem números envolvidos. Em inglês, "a" e "A" são a mesma letra em duas capitalizações, e letras acentuadas como é costumam ser ordenadas perto de e. O turco, no entanto, trata "ı" (i sem ponto) e "i" (i com ponto) como duas letras distintas, cada uma com a sua própria posição no alfabeto — uma distinção que uma comparação bruta de pontos de código, que apenas verifica valores numéricos Unicode, não tem forma de conhecer. O localeCompare, o mesmo método Intl por trás da opção de ordenação natural, tem em conta as regras do idioma: com sensitivity: "base" trata as diferenças de maiúsculas/minúsculas e de acentuação como equivalentes para fins de ordenação, respeitando ainda a ordem real das letras de cada alfabeto, seja esse alfabeto o inglês, o turco, o alemão ou outro idioma de escrita latina.

Esta ferramenta combina ambas as preocupações numa só passagem: escolha a ordem alfabética A→Z ou Z→A como base, opcionalmente sobreponha a ordenação numérica natural para que os números incorporados sejam comparados por valor em vez de por dígito, e depois, opcionalmente, remova linhas duplicadas, linhas em branco e espaços em branco no início ou no fim. Como a deteção de duplicados compara as linhas como sequências exatas, aparar os espaços importa: "apple" e "apple " (com um espaço no fim) parecem diferentes numa verificação de duplicados a menos que o espaço final seja removido primeiro, por isso as opções de aparar e de remover duplicados foram concebidas para funcionar em conjunto, e não como interruptores independentes.

Perguntas Frequentes

Por que "item10" aparece antes de "item2" quando ordeno a minha lista?

Porque uma ordenação alfabética simples compara o texto carácter a carácter em vez de tratar sequências de dígitos como números inteiros — o carácter "1" é menor que "2", por isso item10 vence essa comparação numa única posição, mesmo que dez seja maior que dois. Ative a ordenação natural ou numérica para corrigir isto: ela deteta dígitos consecutivos como um único número e compara a magnitude em vez de caracteres individuais.

O que conta exatamente como uma linha "duplicada"?

Duas linhas só são duplicadas se coincidirem exatamente, carácter por carácter, incluindo maiúsculas/minúsculas e quaisquer espaços no início ou no fim — "Apple" e "apple" são tratadas como linhas diferentes, tal como "banana" e "banana " com um espaço no fim. Ative a opção de aparar antes de remover duplicados se as diferenças de espaços em branco devem ser ignoradas.

Aparar espaços em branco altera o número de duplicados removidos?

Sim. Se duas linhas, de resto idênticas, diferirem apenas por espaços no início ou no fim, contam como linhas separadas até serem aparadas. Marcar "aparar espaços em branco no início e no fim" normaliza ambas antes de a verificação de duplicados ser executada, pelo que essas linhas quase idênticas se fundem numa só.

O localeCompare é fiável para ordenar texto não inglês, como turco ou alemão?

Sim — o localeCompare é uma função nativa do navegador, concebida especificamente para uma ordenação corretamente adaptada ao idioma, pelo que sabe que o turco trata o "i" com ponto e o "ı" sem ponto como letras separadas, e geralmente lida com caracteres acentuados da forma que um leitor desse idioma esperaria, algo que uma simples comparação de "menor que" baseada em pontos de código Unicode brutos não consegue fazer.

Esta ferramenta carrega ou armazena o meu texto nalgum lugar?

Não — tudo corre localmente no navegador usando JavaScript; as linhas nunca são enviadas para um servidor, registadas ou guardadas. Atualizar ou fechar o separador limpa completamente a entrada.

Comentários

Ainda não há comentários — seja o primeiro a escrever um!

Ferramentas Semelhantes