1. 概要
このチュートリアルでは、文字列をアルファベット順に並べ替える方法を示します。
それを実行したい理由はたくさんあるかもしれません。そのうちの1つは、2つの単語が同じ文字セットで構成されている場合の検証である可能性があります。 そうすれば、それらがアナグラムであるかどうかを確認します。
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を利用して、Stringを並べ替えることができます。
@Test
void givenString_whenSortJava8_thenSorted() {
String sorted = "bdca".chars()
.sorted()
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
assertThat(sorted).isEqualTo("abcd");
}
ここでは、最初の例と同じアルゴリズムを使用していますが、 Streamsorted()メソッドを使用してchar配列を並べ替えています。
文字はASCIIコードでソートされるため、大文字は常に先頭に配置されることに注意してください。 したがって、「abC」を並べ替える場合、並べ替えの結果は「Cab」になります。
これを解決するには、toLowerCase()メソッドを使用して文字列を変換する必要があります。 Anagramバリデーターの例でこれを行います。
3. テスト
並べ替えをテストするために、アナグラムバリデーターを作成します。 前述のように、アナグラムは、2つの異なる単語または文が同じ文字セットの複合語である場合に発生します。
AnalogValidatorクラスを見てみましょう。
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が2つの方法でアルファベット順に並べ替えられる方法を示しました。 また、文字列の並べ替え方法を利用したアナグラムバリデーターを実装しました。
いつものように、完全なコードはGitHubプロジェクトで入手できます。