Estoy poniendo en práctica un código para mi universidad y tengo que ordenar dos clases por su nombre. Así, empecé a usar Java compareTo
para cuerdas, pero no lo estaba haciendo correctamente. Por ejemplo, tengo estos dos nombres TEST-6
y TEST-10
. Sin embargo, el resultado fue TEST-10
por delante de TEST-6
.
He buscado y me esta solución:
private int compare(String o1, String o2) {
return extractInt(o1) - extractInt(o2);
}
private int extractInt(String s) {
String num = s.replaceAll("\\D", "");
// return 0 if no digits found
return num.isEmpty() ? 0 : Integer.parseInt(num);
}
Pero mis cuerdas podrían adoptar cualquier forma. Y cuando traté de esta prueba: TEST-6
e TEST10
) el resultado fue TEST-6
por delante de TEST10
, pero lo que espero es TEST10
entonces TEST-6
.
El resultado esperado debería ser normales comparados cadena, pero la comparación del número total cuando es necesario. Así que si antes de subcadenas números son iguales, el número se compara, si no, mantener la comparación de cadenas. O algo como esto:
TE
TES-100
TEST-1
TEST-6
TESTT-0
TEXT-2
109
Se puede hacer algo así:
list.sort(Comparator.comparing(YourClass::removeNumbers).thenComparing(YourClass::keepNumbers));
Estos son dos métodos:
private static String removeNumbers(String s) {
return s.replaceAll("\\d", "");
}
private static Integer keepNumbers(String s) {
String number = s.replaceAll("\\D", "");
if (!number.isEmpty()) {
return Integer.parseInt(number);
}
return 0;
}
Para los siguientes datos:
List<String> list = new ArrayList<>();
list.add("TEXT-2");
list.add("TEST-6");
list.add("TEST-1");
list.add("109");
list.add("TE");
list.add("TESTT-0");
list.add("TES-100");
Este es el resultado de la clasificación:
[109, TE, TES-100, TEST-1, TEST-6, TESTT-0, TEXT-2]