1. Обзор
В этом уроке мы покажем, как сортировать String
по алфавиту.
Может быть много причин, по которым мы хотели бы это сделать — одна из них может быть проверка, если два слова состоят из одного и того же набора символов. Так мы проверим, являются ли они анаграммой.
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()
. Мы собираемся сделать это в нашем примере валидатора Anagram.
3. Тестирование
Чтобы протестировать сортировку, мы создадим валидатор анаграмм. Как уже упоминалось, анаграмма возникает, когда два разных слова или предложения состоят из одного и того же набора символов.
Давайте посмотрим на наш класс AnagramValidator
:
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. Вывод
В этой быстрой статье мы показали, как String
можно отсортировать в алфавитном порядке двумя способами. Кроме того, мы внедрили валидатор анаграмм, который использует метод сортировки строк.
Как обычно, полный код доступен на проекте GitHub .