Digamos que estoy mostrando datos a un usuario en una cuadrícula, informe, cuadro desplegable, etc. Los datos en cuestión contienen un campo llamado Número de factura . Este campo contiene solo números 2/3 del tiempo, pero el otro 1/3 del tiempo es una mezcla de números alfanuméricos.

Debido a esto, cualquier algoritmo de clasificación ordenaría alfanuméricamente en lugar de numéricamente . Por esta razón, 1000 vendría mucho antes que 99. Porque el primer dígito está ordenado, no el valor completo. Otros elementos como 000333 no se tratarían como «333» y aparecerían antes del 222.

¿Existe algún estándar aquí? ¿Debería intentar convertir todos los valores en un valor numérico y ordenarlos de manera diferente? ¿Cómo se volverían a integrar? ¿O es la ordenación alfanumérica la forma correcta de hacerlo?

Comentarios

  • Si tiene la capacidad de decir, use la subcadena para truncar las tres primeras dígitos que tienen los alfabetos y se ordenan únicamente en función de los últimos tres dígitos, en su caso, digamos ABC333 y 000222; podría implementar esto. Claro, mientras se muestra vendría en el orden 000222 y luego ABC333. Sin embargo, visualmente sería un poco confuso ver ceros contra pocos números y alfabetos contra otros. ¿Qué sugieren los alfabetos?
  • Varias longitudes para que no haya SubString. Creo que ver » 10 » antes que » 9 » (en realidad MUY antes de las 9) sería confuso para los usuarios que no ‘ t usan números alfanuméricos con frecuencia. Por otro lado, una mezcla pura de estos realmente ‘ t no se puede ordenar de ninguna manera agradable que yo pueda ver.
  • Si se trata de facturas, ¿puede ordenarlas? por fecha o se necesita explícitamente que se clasifique de acuerdo con el número de factura en sí? Tal vez pueda usar otra columna de la tabla y ordenarlas en consecuencia. Suponiendo que se generen en orden creciente, tendría sentido un orden cronológico de facturas con la más frecuente generada en la parte superior, ¿no? No estoy seguro de para qué sirve realmente el menú desplegable o cómo puede el usuario beneficiarse del tipo. Si pudiera darnos más información sobre el uso del campo, ¡sería mucho más útil!
  • Depende del usuario ‘. Pueden ver estos datos a través de informes, a través de una pantalla de contabilidad que les permite verificar los saldos con Net 30 (ver todas las facturas de un proveedor), etc. El usuario elige cómo quiere que se clasifique la pantalla o el informe. La fecha es una opción. Pero también lo es el número de factura. Estos no son generados por mi aplicación. Solicita suministros, piezas, etc. a los proveedores. Ese proveedor específico le devuelve un número de factura. Como si realizara un pedido en cinco tiendas en línea y obtuviera cinco números de pedido. Algunos son numéricos, otros no.
  • Debe convertir estos números a un formato numérico. Use esto solo para ordenar los valores alfanuméricos. Los números convertidos no necesitan mostrarse al usuario para causar más confusión. Sin embargo, le recomiendo encarecidamente que tenga otra columna, por ejemplo: Fecha para complementar los alfanuméricos. Dado que ordenar alfanuméricos será un poco confuso, otra columna para ayudar al usuario a determinar la fecha relevante o algo más sería de gran ayuda.

Respuesta

A partir de Windows 7, Microsoft cambió su método predeterminado de ordenar directorios por nombre de archivo para usar la clasificación «numérica». (Alguna información aquí )

Si bien no pude encontrar una especificación de su comportamiento, logré aplicar ingeniería inversa. Este algoritmo debería compare dos cadenas alfanuméricas y determine cuál viene primero.

  • Divida cada nombre de archivo en partes alfabéticas y numéricas; es decir, el nombre text123moretext456 se convierte en el list {"text", "123", "moretext", "456"}

  • Para cada parte de los dos nombres divididos, realice la siguiente comparación:

    • Si ambas partes son estrictamente numéricas, compare como números
      • Si los números son iguales, compárelos como cadenas
      • Si las cadenas son iguales, continúe con la siguiente parte
    • Si ambas partes son estrictamente letras, compárelas como cadenas
      • Si son iguales, continúe con la siguiente parte
  • Si se queda sin piezas, el nombre con la menor cantidad de piezas viene f primero

Termina con un orden como el siguiente:

2 12 200000 1000000 a a12 b2 text2 text2a text2a2 text2a12 text2b text12 text12a 

Comentarios

  • Esto es exactamente lo que estaba buscando, y el orden de clasificación resultante tiene sentido. ¡Gracias!

Responder

Esta pregunta (y especialmente la respuesta de @Harrison Paine) me ayudó en mi proyecto y quiero proporcionar la implementación [javascript] de su respuesta para referencia futura.Aquí está la clasificación function:

var win7sort = function(a, b) { var regex = /[^\d]+|\d+/g; // Split each filename into alphabetical and numeric parts var ar = a.match(regex); var br = b.match(regex); var localeCompare; // For each part in the two split names, perform the following comparison: for(var ia in ar) { for(var ib in br) { var ari = ar[ib]; if(ari == undefined) { ari = ""; } var bri = br[ib]; if(bri == undefined) { bri = ""; } // If both parts are strictly numeric, compare them as numbers if(!isNaN(ari) && !isNaN(bri)) { localeCompare = ari.localeCompare(bri, {}, { numeric: true }); } else { localeCompare = ari.localeCompare(bri, {}, { ignorePunctuation: true, sensitivity: "base" }); } if(localeCompare != 0) { // If you run out of parts, the name with the fewest parts comes first return localeCompare; } // If they"re the same, move on to the next part } } return localeCompare; }; 

Y así es como se usa:

var list = ["1", "a", "z", "new folder 2", "new folder 03", "new folder 03-a", "new folder 039", "new folder 5", "new folder 41", "2", "21", "3", "41", "100"]; var sortedList = list.sort(win7sort); 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *