Classificando uma string em ordem alfabética em Java
1. Visão geral
Neste tutorial, mostraremos como classificarString em ordem alfabética.
Pode haver muitos motivos pelos quais gostaríamos de fazer isso - um deles poderia ser a validação se duas palavras forem compostas do mesmo conjunto de caracteres. Assim, verificaremos se são anagramas.
2. Classificando uma String
Internamente,String usa uma matriz de caracteres para operar. Portanto, podemos fazer uso dotoCharArray() : char[] method, sort the array and create a new String based on the result:
@Test
void givenString_whenSort_thenSorted() {
String abcd = "bdca";
char[] chars = abcd.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
assertThat(sorted).isEqualTo("abcd");
}
No Java 8, podemos aproveitar a APIStream para classificarString para nós:
@Test
void givenString_whenSortJava8_thenSorted() {
String sorted = "bdca".chars()
.sorted()
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
assertThat(sorted).isEqualTo("abcd");
}
Aqui, estamos usando o mesmo algoritmo do primeiro exemplo, mas classificando a matriz char usando o métodoStream sorted().
Observe que os caracteres sãosorted by its ASCII codes, portanto, as letras maiúsculas sempre ocorrerão no início. Portanto, se quisermos classificar “abC”, o resultado da classificação será “Cab”.
Para resolvê-lo, precisamostransform the string with toLowerCase() method. Faremos isso em nosso exemplo do validador de anagramas.
3. Teste
Para testar a classificação, construiremos o validador de anagramas. Como mencionado, um anagrama ocorre quando duas palavras ou frases diferentes são compostas do mesmo conjunto de caracteres.
Vamos dar uma olhada em nossa classeAnagramValidator:
public class AnagramValidator {
public static boolean isValid(String text, String anagram) {
text = prepare(text);
anagram = prepare(anagram);
String sortedText = sort(text);
String sortedAnagram = sort(anagram);
return sortedText.equals(sortedAnagram);
}
private static String sort(String text) {
char[] chars = prepare(text).toCharArray();
Arrays.sort(chars);
return new String(chars);
}
private static String prepare(String text) {
return text.toLowerCase()
.trim()
.replaceAll("\\s+", "");
}
}
Agora, vamos usar nosso método de classificação e verificar se o anagrama é válido:
@Test
void givenValidAnagrams_whenSorted_thenEqual() {
boolean isValidAnagram = AnagramValidator.isValid("Avida Dollars", "Salvador Dali");
assertTrue(isValidAnagram);
}
4. Conclusão
Neste artigo rápido, mostramos como osString podem ser classificados em ordem alfabética de duas maneiras. Além disso, implementamos o validador de anagramas que faz uso do método de classificação de string.
Como de costume, o código completo está disponível emGithub project.