2009-01-14 13 views
17

Sto cercando un algoritmo che ordina le stringhe in modo simile al modo in cui i file (e le cartelle) sono ordinati in Esplora risorse. Sembra che i valori numerici in stringhe vengono presi in considerazione quando ordinato che si traduce in qualcosa di similemetodo di ordinamento di Windows Explorer

name 1, name 2, name 10 

invece di

name 1, name 10, name 2 

che si ottiene con un regolare confronto tra stringhe.

Stavo per iniziare a scriverlo da solo, ma volevo verificare se qualcuno lo avesse già fatto ed ero disposto a condividere codice o approfondimenti. Il modo in cui mi avvicinerei a questo sarebbe aggiungere gli zero iniziali ai valori numerici nel nome prima di confrontarli. Ciò si tradurrebbe in qualcosa di simile

name 00001, name 00010, name 00002 

che in caso di ordinamento con un ordinamento di stringa normale mi avrebbe dato il risultato corretto.

Qualche idea?

+1

http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp –

risposta

14

Si chiama "ordine naturale". Jeff aveva un pretty extensive blog entry su di esso qualche tempo fa, che descrive le difficoltà che potresti trascurare e ha collegamenti a diverse implementazioni.

1

Il modo in cui l'ho capito, Windows Explorer ordina secondo il tuo secondo esempio: mi ha sempre irritato enormemente l'ordine che viene fuori 1, 10, 2. Ecco perché la maggior parte delle app che scrivono molti file (come le app in batch) sempre utilizzare nomi di file a lunghezza fissa con 0 o precedenti.

La soluzione dovrebbe funzionare, ma dovresti stare attento a dove si trovavano i numeri nel nome del file e probabilmente utilizzare il tuo approccio solo se fossero alla fine.

6

Explorer utilizza l'API StrCmpLogicalW() per questo tipo di ordinamento (chiamato 'ordinamento naturale').

Non è necessario scrivere la propria funzione di confronto, basta usare quella già esistente.

Una buona spiegazione può essere trovata here.

0

Questa è una prova per la sua attuazione in Java:

Java - Sort Strings like Windows Explorer

In breve si divide le due stringhe da confrontare nella Lettera - Parti Digit e lo confronta parti in un modo specifico per ottenere questo tipo di ordinamento.

Problemi correlati