Перейти к основному содержимому

Сортировка символов строки по алфавиту в Java

· 2 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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 .