1. Overview
In this tutorial, we’ll show how to sort String alphabetically.
There might be plenty of reason why we’d like to do it – one of them could be validation if two words are composed of the same characters set. That way, we’ll verify if they’re an anagram.
2. Sorting a String
Internally, String uses an array of characters to operate on. Therefore, we can make use of the toCharArray() : char[] method, sort the array and create a new String based on the result:
@Test void givenString_whenSort_thenSorted() { String abcd = "bdca"; char[] chars = abcd.toCharArray(); Arrays.sort(chars); String sorted = new String(chars); assertThat(sorted).isEqualTo("abcd"); }
In Java 8, we can leverage the Stream API to sort the String for us:
@Test void givenString_whenSortJava8_thenSorted() { String sorted = "bdca".chars() .sorted() .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString(); assertThat(sorted).isEqualTo("abcd"); }
Here, we’re using the same algorithm as the first example, but sorting the char array using the Stream sorted() method.
Notice, that characters are sorted by its ASCII codes, therefore, capital letters will always occur at the beginning. So, if we’d like to sort “abC” the result of sorting will be “Cab”.
To solve it, we need to transform the string with toLowerCase() method. We’re going to do that in our Anagram validator example.
3. Testing
To test sorting, we’ll build the anagram validator. As mentioned an anagram occurs when two different words or sentences are compound of the same set of characters.
Let’s have a look at our AnagramValidator class:
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+", ""); } }
Now, we’re going to make use of our sorting method and verify whether the anagram is valid:
@Test void givenValidAnagrams_whenSorted_thenEqual() { boolean isValidAnagram = AnagramValidator.isValid("Avida Dollars", "Salvador Dali"); assertTrue(isValidAnagram); }
4. Conclusion
In this quick article, we’ve shown how the String might be sorted in alphabetical order in two ways. Also, we’ve implemented the anagram validator which made use of the string sorting method.
As usual, the complete code is available on the Github project.