Perché alcuni metodi di ordinamento ordinano per 1, 10, 2, 3 ...?


31

Ho notato che molti metodi di ordinamento numerico sembrano ordinare in base a 1, 10, 2, 3 ... anziché al previsto 1, 2, 3, 10 ... Ho problemi a inventare uno scenario in cui vorrei Ho bisogno del primo metodo e, come utente, mi sento frustrato ogni volta che lo vedo in pratica. Esistono casi d'uso legittimi per il primo stile rispetto al secondo? Se sì, quali sono? In caso contrario, come è mai nato il primo stile di ordinamento? Quali sono i nomi ufficiali per ciascun metodo di ordinamento?


Non è una risposta alla tua domanda, ma se devi ordinare un elenco di stringhe che potrebbero contenere numeri, probabilmente vorrai utilizzare l'algoritmo Alphanum: davekoelle.com/alphanum.html
TehShrike

È molto molto semplice Durante l'ordinamento, l'algoritmo esegue la scansione da sinistra a destra. Quindi, quando si tratta di un 1 e un 5, il 5 è più grande, ed è semplicemente stupido con questo ANCHE se l'1 fa effettivamente parte di un numero più grande come 134234. Per sapere che 134234 è maggiore di 5, dobbiamo effettivamente scansionare oltre il numero fino all'ultima cifra (in realtà la prima cifra) 4 quindi lavorare all'indietro e vedere che quello è in realtà un 100000 che è molto più grande di 5. Quindi, il tuo ordinamento cieco tipico non lo fa poiché confronta solo il carattere con carattere che ignora ciò che accade dopo (o prima) nel confronto.
AbstractDissonance

1
Se leggi en.wikipedia.org/wiki/Natural_sort_order dovrebbe avere senso. In ordine naturale, le stringhe di cifre sono raggruppate come un singolo "carattere". Non fisicamente, solo logicamente, in modo che possiamo ancora avere confronti dei caratteri come il primo caso, ma saremo in grado di confrontare stringhe intere con stringhe intere anziché caratteri con caratteri, il che ci consentirà di confrontare il valore completo. Tutti i tipi dovrebbero essere così perché questo è il modo in cui gli esseri umani leggono le cose (per i numeri, in realtà leggiamo da destra a sinistra, anche in una stringa da sinistra a destra 1234 = 1000 + 200 + 30 + 4, non 4000 + 300 + 20 + 1
AbstractDissonance

Risposte:


63

questo è l' ordinamento lessicografico, il che significa che sostanzialmente il linguaggio tratta le variabili come stringhe e confronta carattere per carattere ( "200"è maggiore di "19999"perché '2'è maggiore di '1')

per risolvere questo è possibile

  • assicurarsi che i valori siano trattati come numeri interi,

  • anteponi '0'alle stringhe in modo che tutte abbiano uguale lunghezza (praticabile solo quando conosci il valore massimo).
    Questo è il motivo per cui vedrai la numerazione degli episodi sui file multimediali (S1E01) con uno 0 anteposto, quindi un ordinamento lessicografico non rovina le cose e consente ai programmi di riprodurre / visualizzare semplicemente in ordine alfabetico,

  • oppure crea un comparatore personalizzato che confronta prima la lunghezza delle stringhe (le stringhe più brevi sono numeri interi più piccoli) e quando sono uguali confronta il lessicografico (attenzione al comando '0')


5
+1 per "lexiographic". Non ho mai sentito quel termine, avrei solo pensato a questo come a un ordinamento alfabetico: i numeri vengono trattati come un tipo di stringa, come hai detto tu.
Anonimo il

3
+1 per anteporre '0' alle stringhe. Non lo stavo programmando, era nel nome delle mie cartelle e "Chapter 10" stava arrivando prima di "Chapter 2". Poi ho fatto i capitoli 1-9 chiamati 01-09 e ora sono ordinati "correttamente".
Marvin

6

In ordine alfabetico, 1 viene prima di 2. Ogni volta che vedi il primo metodo, non è perché è desiderabile, ma perché l'ordinamento è rigorosamente alfabetico (e avviene da sinistra a destra, un carattere alla volta): 1, 2, 10 ha senso a te ma non a un computer che conosce solo il confronto alfabetico. In questo tipo di semplice confronto non c'è modo di sapere che uno seguito da uno 0 viene effettivamente dopo un due.

Quando vedi l'ordinamento misto di parole e numeri che tratta correttamente i numeri, è perché l'ordinamento è più intelligente e, soprattutto, di solito funziona solo all'inizio o alla fine di una stringa.


4

Questo è il risultato quando si ordinano le stringhe di numeri in ordine alfabetico anziché numerico.

Quello stile di ordinamento è il comportamento predefinito del sortcomando unix, ad esempio, a meno che non si usi l' --numeric-sortopzione della riga di comando, che gli dice di provare a interpretare i valori numerici.


4

Altri hanno una risposta su cosa sia questo tipo, ma nessuno ha veramente risposto alla tua domanda sul perché lo vedi. La risposta non è poi così eccitante. Di solito è un bug. La maggior parte dei metodi di ordinamento passerà automaticamente all'uno o all'altro e la programmazione è probabilmente incurante di modificare il valore predefinito durante l'ordinamento dei numeri.


In contesti alfabetici / numerici misti, gli utenti esperti tenderanno a preferire l'ordinamento lessiografico, poiché è coerente e prevedibile. Ogni app che cerca di mescolare "in modo intelligente" l'ordinamento lessicale e numerico lo fa in modo leggermente diverso, rendendo il tipo di utilità discutibile.
j__m
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.