Javaで文字列を逆にする方法

1. 概要

このクイックチュートリアルでは、* Javaで_String_を逆にする方法を説明します。*
この処理は、プレーンなJavaソリューションを使用して開始します。 次に、Apache Commonsのようなサードパーティライブラリが提供するオプションを見ていきます。
さらに、*文の単語の順序を逆にする方法*を示します。

2. 従来の_for_ループ

文字列はlink:/java-immutable-object[Javaで不変]であることを知っています。 不変オブジェクトとは、完全に作成された後に*内部状態が一定*のままであるオブジェクトです。
したがって、_String_を変更して元に戻すことはできません。 このため、別の_String_を作成する必要があります。
最初に、_for_ループを使用した基本的な例を見てみましょう。 最後の要素から最初の要素への_String_入力を反復処理し、すべての文字を新しい_String_に連結します。
public String reverse(String input) {

    if (input == null) {
        return input;
    }

    String output = "";

    for (int i = input.length() - 1; i >= 0; i--) {
        output = output + input.charAt(i);
    }

    return output;
}
ご覧のとおり、コーナーケースに注意し、個別に扱う必要があります。
この例をよりよく理解するために、単体テストを作成できます。
@Test
public void whenReverseIsCalled_ThenCorrectStringIsReturned() {
    String reversed = ReverseStringExamples.reverse("cat");
    String reversedNull = ReverseStringExamples.reverse(null);
    String reversedEmpty = ReverseStringExamples.reverse(StringUtils.EMPTY);

    assertEquals("tac", reversed);
    assertEquals(null, reversedNull);
    assertEquals(StringUtils.EMPTY, reversedEmpty);
}

*3. StringBuilder *

Javaは、https://www.baeldung.com/java-string-builder-string-buffer [mutable sequence of characters] *を作成する* _StringBuilder_や_StringBuffer_などのメカニズムも提供します。 これらのオブジェクトには、目的の結果を達成するのに役立つ_reverse()_メソッドがあります。
ここでは、_String_入力から_StringBuilder_を作成し、_reverse()_メソッドを呼び出す必要があります。
public String reverseUsingStringBuilder(String input) {
    if (input == null) {
        return null;
    }

    StringBuilder output = new StringBuilder(input).reverse();
    return output.toString();
}

*4. Apache Commons *

link:/java-commons-lang-3[Apache Commons]は、文字列操作を含む多くのユーティリティクラスを備えた人気のあるJavaライブラリです。
通常どおり、Apache Commonsの使用を開始するには、まずhttps://search.maven.org/search?q=g:org.apache.commons%20AND%20a:commons-lang3を追加する必要があります
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>
_StringUtils_クラスは、_StringBuilder_と同様の_reverse()_メソッドを提供するため、ここで必要なものです。
このライブラリを使用する利点の1つは、*そのユーティリティメソッドが_null_-safe操作*を実行することです。 したがって、エッジケースを個別に扱う必要はありません。
目的を達成し、_StringUtils_クラスを使用するメソッドを作成しましょう。
public String reverseUsingApacheCommons(String input) {
    return StringUtils.reverse(input);
}
さて、これらの3つのメソッドを見ると、3番目のメソッドは_String_を逆にする*最も簡単でエラーが発生しにくい*方法であると言えます。

5. 文中の単語の順序を逆にする

ここで、単語がスペースで区切られ、句読点が含まれていない文があると仮定します。 この文の単語の順序を逆にする必要があります。
*この問題は、2つの手順で解決できます。https://www.baeldung.com/java-split-string [文の分割]スペース区切り文字によって、単語を逆順に連結します。*
最初に、古典的なアプローチを示します。 問題の最初の部分を満たすために、S__tring.split()__メソッドを使用します。 次に、結果の配列を逆方向に反復処理し、_StringBuilder_を使用して単語を連結します。 もちろん、これらの単語の間にスペースを追加する必要もあります。
public String reverseTheOrderOfWords(String sentence) {
    if (sentence == null) {
        return null;
    }

    StringBuilder output = new StringBuilder();
    String[] words = sentence.split(" ");

    for (int i = words.length - 1; i >= 0; i--) {
        output.append(words[i]);
        output.append(" ");
    }

    return output.toString().trim();
}
次に、Apache Commonsライブラリの使用を検討します。 *もう一度、読みやすくエラーの少ないコードを実現するのに役立ちます。*入力文とデリミタを引数として_StringUtils.reverseDelimited()_メソッドを呼び出すだけです。
public String reverseTheOrderOfWordsUsingApacheCommons(String sentence) {
    return StringUtils.reverseDelimited(sentence, ' ');
}

6. 結論

このチュートリアルでは、Javaで_String_を逆にするさまざまな方法を最初に見てきました。 コアJavaを使用した例と、Apache Commonsなどの一般的なサードパーティライブラリを使用しました。
次に、2つのステップで文の単語の順序を逆にする方法を見てきました。 これらの手順は、文の他の順列を実現するのにも役立ちます。
いつものように、このチュートリアルに示されているすべてのコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/java-strings-2[GitHub上]で入手できます。