Сортиране на низ по азбучен ред в Java

1. Общ преглед

В този урок ще покажем как да сортирате String по азбучен ред.

Може да има много причини, поради които бихме искали да го направим - една от тях може да бъде валидиране, ако две думи са съставени от един и същ набор от символи. По този начин ще проверим дали те са анаграма.

2. Сортиране на низ

Вътрешно String използва масив от символи, за да работи. Следователно можем да използваме метода toCharArray (): char [] , да сортираме масива и да създадем нов String въз основа на резултата:

@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, за да сортираме String за нас:

@Test void givenString_whenSortJava8_thenSorted() { String sorted = "bdca".chars() .sorted() .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString(); assertThat(sorted).isEqualTo("abcd"); }

Тук използваме същия алгоритъм като първия пример, но сортираме масива char с помощта на метода 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. Заключение

В тази бърза статия показахме как низът може да бъде сортиран по азбучен ред по два начина. Също така внедрихме валидатора на anagram, който използва метода за сортиране на низове.

Както обикновено, пълният код е достъпен в проекта GitHub.