Java classifica uma matriz de strings (misturada com números e caracteres) [duplicado]
Estou classificando uma matriz em Java, minhas entradas são {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"} e Quero a saída {"a2", "a3", "a11", "b1", "b2", "b3", "c2", "c3", "c13"}
O que estou fazendo abaixo não está retornando os resultados adequados, qualquer sugestão / exemplo de código será bem-vinda
import java.util.Arrays;
public class Main
{
public static void main(String[] args) {
String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"};
Arrays.sort(var);
System.out.println(Arrays.toString(var));
}
}
Do código acima estou obtendo a saída [a11, a2, a3, b1, b2, b3, c13, c2, c3]
Respostas
Aqui está uma abordagem relativamente simples. No entanto, para algo assim, eu criaria uma classe para conter as partes alfa e numéricas separadamente e escreveria um comparador. Quando imprimo os objetos, simplesmente devo toString()retornar o valor original.
Isso é básico. Ele não verifica se há strings malformadas.
String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"};
Comparator<String> comp = (a,b)->{
// split the strings between the last char and the first digit
String[] v1 = a.split("(?<!\\d)(?=\\d)");
String[] v2 = b.split("(?<!\\d)(?=\\d)");
// convert each integer part to an int.
int n1 = Integer.valueOf(v1[1]);
int n2 = Integer.valueOf(v2[1]);
// compare each and get the result
int r1 = v1[0].compareTo(v2[0]);
int r2 = Integer.compare(n1,n2);
// first sort on r1 (the strings). If they are equal ( r1 == 0)
// then sort on the result of comparing the integers.
return r1 == 0 ? r2 : r1;
};
Array.sort não leva um comparador, portanto, você precisa converter a matriz em uma lista e classificar nela. Isso também mudará o array, pois os arrays de objetos fazem backup da lista retornada Arrays.asList.
Collections.sort(Arrays.asList(var),comp);
System.out.println(Arrays.toString(var));
Impressões
[a2, a3, a11, b1, b2, b3, c2, c3, c13]