¿Dónde puedo encontrar un algoritmo de ordenación que maneje los números dentro de las cadenas correctamente?

En primer lugar, como ya han señalado otros, para la clasificación en sí, utilizará cualquiera de los algoritmos de clasificación conocidos, que abstraen con elegancia cualquier conocimiento sobre el tipo de datos ordenados en una función / función de comparación para que se centren en la clasificación en sí, agnóstica sobre los datos.

Ahora, el verdadero misterio aquí radica en la comparación de nuestros datos. Como usted señala, la simple comparación lexicográfica no es suficiente. Las cadenas no entienden los números, solo propiedades y operaciones homogéneas basadas en caracteres. En C ++ los llamamos rasgos; en SQL los llamamos colaciones. Sin embargo, no está ordenando datos homogéneos aquí, por lo que ya no funcionan, porque está aplicando diferentes semánticas a diferentes partes de sus datos. Está dividiendo una cadena “abc 123” en una cadena “abc” y un número entero 123. Estoy enfatizando un ejemplo intencionalmente simple, porque produce una lógica de comparación simple: divida sus cadenas en una lista de partes que corresponden a datos numéricos y no numéricos y compárelos por partes y en orden: comparaciones lexicográficas para cadenas frente a cadenas / números y comparación numérica para números. Puede generalizar eso para comparar cualquier número, no solo enteros.

Esto significa esencialmente que tokenizará cadenas y comparará tokens. A veces, los límites entre estos tokens son claros e intuitivos, pero a veces no lo son, ya que los números no se pueden separar convenientemente. ¿Cómo se compara “5xyz” y “12foo”? Si extrae los “tokens” numéricos independientemente del hecho de que no haya una separación clara entre ellos y las cadenas adyacentes, obtendrá un resultado, si los ve como dos cadenas alfanuméricas, obtendrá otro, por lo que los resultados variarán según su implementación y De todos los que estamos aquí, usted es el único que conoce la naturaleza de sus datos.

Primero debe definir y codificar por completo alguna función de comparación (comparar dos “cadenas”) que siguen sus reglas (que no adiviné).

Luego, use esa comparación en cualquier algoritmo de clasificación habitual, por ejemplo, quicksort.

Java le permite definir un objeto Comparator como el segundo parámetro de Arrays.sort ()

En este comparador, querrá verificar si los dos parámetros (a, b) a comparar son números. Si ambos son del mismo tipo, devuelva a

Tampoco pude adivinar su regla para comparar cadenas en función de sus ejemplos. ¿A dónde irían “10A” o “A10” o “1A2”? Afortunadamente, los tipos de comparación son totalmente agnósticos acerca de los datos que están clasificando, por lo que una vez que haya descubierto en qué orden necesita que entren las cosas, puede hacer exactamente lo que dijo Basile. Cómo hacerlo depende del idioma en el que esté clasificando.

Una función de clasificación generalmente basada en los valores ASCII al considerar cada elemento como una cadena. Por lo tanto, 12 viene antes que 2 y así sucesivamente. No sé si hay una función incorporada en Java para hacer lo que necesita. ¡Puede que tenga que implementarlo usted mismo!