¿Por qué algunos métodos de clasificación ordenan por 1, 10, 2, 3 ...?

31

He notado que muchos métodos de clasificación numérica parecen ordenar por 1, 10, 2, 3 ... en lugar de los esperados 1, 2, 3, 10 ... Tengo problemas para encontrar un escenario en el que lo haría necesito el primer método y, como usuario, me siento frustrado cada vez que lo veo en la práctica. ¿Hay casos de uso legítimo para el primer estilo sobre el segundo? Si es así, ¿Que son? Si no, ¿cómo surgió el primer estilo de clasificación? ¿Cuáles son los nombres oficiales de cada método de clasificación?

VirtuosiMedia
fuente
No es una respuesta a su pregunta, pero si tiene que ordenar una lista de cadenas que pueden contener números, probablemente desee usar el algoritmo Alfanum
TehShrike
Es muy muy simple. Al ordenar, el algoritmo escanea de izquierda a derecha. Entonces, cuando se trata de un 1 y un 5, el 5 es más grande, y simplemente va tontamente con esto INCLUSO si el 1 es en realidad parte de un número mayor como 134234. Para saber que 134234 es más grande que 5, debemos escanear más allá del número hasta el último dígito (en realidad, el primer dígito) 4 luego trabaje hacia atrás y vea que en realidad es un 100000 que es mucho más grande que 5. Entonces, su clasificación ciega típica no hace esto ya que solo compara el carácter con personaje que ignora lo que ocurre después (o antes) en la comparación.
AbstractDissonance
1
Si lees en.wikipedia.org/wiki/Natural_sort_order debería tener sentido. En orden natural, las cadenas de dígitos se agrupan como un solo "carácter". No físicamente, solo lógicamente para que podamos tener comparaciones de caracteres como el primer caso, pero podremos comparar cadenas enteras con cadenas enteras en lugar de caracteres con caracteres, lo que nos permitirá comparar el valor completo. Todos los tipos deberían ser así porque así es como los humanos leemos las cosas (para los números, en realidad leemos de derecha a izquierda, incluso en una cadena de izquierda a derecha 1234 = 1000 + 200 + 30 + 4, no 4000 + 300 + 20 + 1
AbstractDissonance

Respuestas:

63

es decir, la clasificación lexicográfica, lo que significa que básicamente el lenguaje trata las variables como cadenas y compara caracteres por caracteres ( "200"es mayor que "19999"porque '2'es mayor que '1')

para arreglar esto puedes

  • asegúrese de que los valores se traten como enteros,

  • anteponer '0'las cadenas para que todos tengan la misma longitud (solo viable cuando se conoce el valor máximo).
    Es por eso que verá numeraciones de episodios en archivos multimedia (S1E01) con un 0 antepuesto para que una clasificación lexicográfica no arruine las cosas y permita que los programas simplemente se reproduzcan / muestren en orden alfabético,

  • o haga un comparador personalizado que primero compare la longitud de las cadenas (las cadenas más cortas son enteros más pequeños) y, cuando son iguales, compare la lexicografía (cuidado con el inicio '0')

monstruo de trinquete
fuente
55
+1 para 'lexiográfico'. Nunca escuché ese término, solo hubiera pensado en esto como una clasificación alfabética: los números se tratan como un tipo de cadena, como dijiste.
Anónimo
3
+1 para anteponer '0' a las cadenas. No estaba programando esto, estaba en el nombre de mis carpetas y el 'Capítulo 10' venía antes del 'Capítulo 2'. Luego hice los capítulos 1-9 llamados 01-09 y ahora está ordenado "correctamente".
Marvin
6

Alfabéticamente, 1 viene antes que 2. Siempre que vea el primer método, no es porque sea deseable, sino porque la clasificación es estrictamente alfabética (y ocurre de izquierda a derecha, un carácter a la vez): 1, 2, 10 tiene sentido para usted pero no para una computadora que solo conoce la comparación alfabética. No hay manera en ese tipo de comparación simple de saber que un uno seguido de un 0 realmente viene después un dos.

Cuando ve una clasificación mixta de palabras y números que trata los números correctamente, es porque la clasificación es más inteligente y, además, generalmente solo funciona al principio o al final de una cadena.

Nicole
fuente
4

Ese es el resultado cuando ordena cadenas de números alfabéticamente en lugar de numéricamente.

Ese estilo de clasificación es el comportamiento predeterminado del sortcomando unix, por ejemplo, a menos que use la --numeric-sortopción de línea de comando, que le dice que intente interpretar los valores numéricos.

como se llame
fuente
4

Otros tienen respuestas sobre qué es este tipo, pero nadie realmente respondió a su pregunta sobre por qué lo ve. La respuesta no es realmente tan emocionante. Suele ser un error. La mayoría de los métodos de clasificación serán predeterminados a uno u otro y la programación probablemente no tenga cuidado de cambiar el valor predeterminado al ordenar los números.

frankc
fuente
En contextos alfabéticos / numéricos mixtos, los usuarios experimentados tenderán a preferir la clasificación lexiográfica, porque es consistente y predecible. Cada aplicación que trata de mezclar "inteligentemente" la clasificación lexiográfica y numérica lo hace de manera un poco diferente, lo que hace que el tipo de utilidad sea cuestionable.
j__m