algorithm - complexity - Método de ordenación de Windows Explorer
sorting algorithms complexity (8)
De la forma en que lo entendí, Windows Explorer ordena según tu segundo ejemplo: siempre me irritó enormemente que salga el pedido 1, 10, 2. Es por eso que la mayoría de las aplicaciones que escriben muchos archivos (como aplicaciones por lotes) siempre usan nombres de archivos de longitud fija con 0 o lo que sea.
Su solución debería funcionar, pero tendría que tener cuidado donde están los números en el nombre del archivo, y probablemente solo use su enfoque si estuvieran al final.
Estoy buscando un algoritmo que ordene cadenas similares a la forma en que los archivos (y las carpetas) se ordenan en el Explorador de Windows. Parece que los valores numéricos en cadenas se tienen en cuenta cuando se ordenan, lo que da como resultado algo así como
name 1, name 2, name 10
en lugar de
name 1, name 10, name 2
que obtienes con una comparación regular de cadenas.
Estaba a punto de comenzar a escribir esto, pero quería comprobar si alguien había hecho esto antes y estaba dispuesto a compartir algunos códigos o ideas. La forma en que abordaría esto sería agregar ceros a los valores numéricos en el nombre antes de compararlos. Esto daría como resultado algo así como
name 00001, name 00010, name 00002
que cuando se ordena con una ordenación de cadena regular me daría el resultado correcto.
¿Algunas ideas?
Mira esto
http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting
para algún código fuente.
Se llama "orden de clasificación natural". Jeff tuvo una entrada bastante extensa en el blog hace un tiempo, que describe las dificultades que puede pasar por alto y tiene enlaces a varias implementaciones.
Existe StrCmpLogicalW , pero solo está disponible comenzando con Windows XP y solo implementado como Unicode.
Algunos antecedentes: http://www.siao2.com/2006/10/01/778990.aspx
Explorer utiliza la API StrCmpLogicalW () para este tipo de clasificación (llamado ''orden de clasificación natural'').
No necesita escribir su propia función de comparación, solo use la que ya existe.
Una buena explicación se puede encontrar aquí .
Este es un intento de implementarlo en Java:
Java - Ordenar cadenas como Windows Explorer
En resumen, divide las dos cadenas para comparar en letras - partes de dígitos y compara estas partes de una manera específica para lograr este tipo de clasificación.
Publiqué el código (C #) y una descripción del algoritmo aquí:
También publiqué una pregunta relacionada con pistas y dificultades adicionales: