Ordenando matriz de cadenas que contienen número

Caio Ambrosio:

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 compareTopara cuerdas, pero no lo estaba haciendo correctamente. Por ejemplo, tengo estos dos nombres TEST-6y TEST-10. Sin embargo, el resultado fue TEST-10por 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-6e TEST10) el resultado fue TEST-6por delante de TEST10, pero lo que espero es TEST10entonces 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
Mushif Ali Nawaz:

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]

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=335992&siteId=1
Recomendado
Clasificación