«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(). Мы собираемся сделать это в нашем примере валидатора 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.

«