Автор оригинала: 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 .