Автор оригинала: Denis Szczukocki.
1. Обзор
В этом уроке мы покажем, как сортировать Строку по алфавиту.
Может быть много причин, по которым мы хотели бы это сделать – одна из них может быть проверкой, если два слова состоят из одного и того же набора символов. Таким образом, мы проверим, являются ли они анаграммой.
2. Сортировка строки
Внутренне String использует массив символов для работы. Поэтому мы можем использовать метод toCharArray(): char [] , отсортировать массив и создать новую Строку на основе результата:
@Test
void givenString_whenSort_thenSorted() {
String abcd = "bdca";
char[] chars = abcd.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
assertThat(sorted).isEqualTo("abcd");
}В Java 8 мы можем использовать Stream API для сортировки Строки для нас:
@Test
void givenString_whenSortJava8_thenSorted() {
String sorted = "bdca".chars()
.sorted()
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
assertThat(sorted).isEqualTo("abcd");
}Здесь мы используем тот же алгоритм, что и в первом примере, но сортируем массив символов с помощью метода Stream sorted () .
Обратите внимание, что символы отсортированы по кодам ASCII , поэтому заглавные буквы всегда будут встречаться в начале. Итак, если мы хотим отсортировать “abC”, результатом сортировки будет “Cab”.
Чтобы решить эту проблему, нам нужно преобразовать строку с помощью toLowerCase() метода . Мы собираемся сделать это в нашем примере с валидатором анаграмм.
3. Тестирование
Чтобы проверить сортировку, мы построим валидатор анаграмм. Как уже упоминалось, анаграмма возникает, когда два разных слова или предложения состоят из одного и того же набора символов.
Давайте взглянем на наш Валидатор анаграмм класс:
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+", "");
}
}Теперь мы собираемся использовать наш метод сортировки и проверить, является ли анаграмма действительной:
@Test
void givenValidAnagrams_whenSorted_thenEqual() {
boolean isValidAnagram = AnagramValidator.isValid("Avida Dollars", "Salvador Dali");
assertTrue(isValidAnagram);
}4. Заключение
В этой краткой статье мы показали, как Строка может быть отсортирована в алфавитном порядке двумя способами. Кроме того, мы внедрили валидатор анаграмм, в котором использовался метод сортировки строк.
Как обычно, полный код доступен в проекте GitHub .