Por que alguns métodos de classificação são classificados por 1, 10, 2, 3 ...?


30

Eu notei que muitos métodos de classificação numérica parecem classificar por 1, 10, 2, 3 ... em vez dos 1, 2, 3, 10 esperados ... Estou tendo problemas para apresentar um cenário em que gostaria preciso do primeiro método e, como usuário, fico frustrado sempre que o vejo na prática. Existem casos de uso legítimos para o primeiro estilo no segundo? Se sim, o que são? Se não, como surgiu o estilo de primeira classe? Quais são os nomes oficiais para cada método de classificação?


Não é uma resposta à sua pergunta, mas se você tem que classificar uma lista de strings que podem conter números, você provavelmente vai querer usar o algoritmo alphanum: davekoelle.com/alphanum.html
TehShrike

É muito, muito simples. Ao classificar, o algoritmo digitaliza da esquerda para a direita. Portanto, quando se trata de um 1 e um 5, o 5 é maior e, de maneira estúpida, acompanha esse mesmo, mesmo que o 1 seja realmente parte de um número maior como 134234. Para saber que 134234 é maior que 5, devemos realmente digitalizar depois do número até o último dígito (na verdade, o primeiro dígito) 4, trabalhe para trás e veja que esse é realmente um 100000 muito maior que 5. Portanto, sua classificação cega típica não faz isso, pois apenas compara o caractere ao caractere que ignora o que ocorre após (ou antes) na comparação.
AbstractDissonance

11
Se você ler en.wikipedia.org/wiki/Natural_sort_order , deve fazer sentido. Em ordem natural, cadeias de dígitos são agrupadas como um único "caractere". Não fisicamente, apenas logicamente, para que ainda possamos ter comparações de caracteres como o primeiro caso, mas seremos capazes de comparar cadeias inteiras com cadeias inteiras em vez de caracteres com caracteres, o que nos permitirá comparar o valor total. Todos os tipos devem ser assim, porque é assim que nós humanos lemos as coisas (para números, na verdade lemos da direita para a esquerda, mesmo na sequência da esquerda para a direita 1234 = 1000 + 200 + 30 + 4, não 4000 + 300 + 20 + 1
ResumoDissonância

Respostas:


62

que é uma classificação lexicográfica, o que significa basicamente que o idioma trata as variáveis ​​como strings e compara caractere por caractere ( "200"é maior que "19999"porque '2'é maior que '1')

para consertar isso você pode

  • garantir que os valores sejam tratados como números inteiros,

  • adicione '0'as seqüências de caracteres para que todos tenham comprimentos iguais (somente viável quando você souber o valor máximo).
    É por isso que você verá numerações de episódios em arquivos de mídia (S1E01) com um 0 precedido, para que uma classificação lexicográfica não estrague tudo e permita que os programas simplesmente sejam reproduzidos / exibidos em ordem alfabética,

  • ou faça um comparador personalizado que compare primeiro o comprimento das cadeias (cadeias mais curtas são números inteiros menores) e, quando iguais, compare o lexicograficamente (cuidado com a liderança '0')


5
+1 for 'lexiographic'. Never heard that term, I would just have thought of this as alphabetic sorting - the numbers are being treated as a string type, like you said.
Anonymous

3
+1 para anexar '0' às seqüências de caracteres. Eu não estava programando isso, estava no nome das minhas pastas e o 'Capítulo 10' estava antes do 'Capítulo 2'. Então eu fiz os capítulos 1-9 chamados 01-09 e agora estão "corretamente".
Marvin

6

Em ordem alfabética, 1 vem antes de 2. Sempre que você vê o primeiro método, não é porque é desejável, mas porque a classificação é estritamente alfabética (e acontece da esquerda para a direita, um caractere de cada vez): 1, 2, 10 faz sentido para você, mas não para um computador que conhece apenas a comparação alfabética. Não há como esse tipo de comparação simples saber que um seguido de um 0 vem depois de dois.

Quando você vê a classificação mista de palavras e números que trata os números corretamente, é porque a classificação é mais inteligente e, além disso, ainda funciona normalmente apenas no início ou no final de uma string.


4

Esse é o resultado quando você ordena seqüências de números alfabeticamente em vez de numericamente.

Esse estilo de classificação é o comportamento padrão do sortcomando unix, por exemplo, a menos que você use a --numeric-sortopção de linha de comando, que informa para tentar interpretar os valores numéricos.


4

Outros têm respostas de que tipo é esse, mas ninguém realmente respondeu à sua pergunta sobre por que você a vê. A resposta não é realmente tão emocionante. Geralmente é um bug. A maioria dos métodos de classificação será padronizada para um ou outro, e a programação provavelmente não fará alterações no padrão ao classificar números.


Em contextos alfabéticos / numéricos mistos, os usuários experientes tendem a preferir a classificação lexiográfica, porque é consistente e previsível. Todo aplicativo que tenta "inteligentemente" misturar a classificação numérica e lexiográfica o faz de maneira um pouco diferente, tornando o tipo de utilidade questionável.
j__m
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.