1. 概要

このクイックチュートリアルでは、Javaで文字列を反転する方法を説明します。

プレーンなJavaソリューションを使用してこの処理を開始します。 次に、ApacheCommonsなどのサードパーティライブラリが提供するオプションを見ていきます。

さらに、文中の語順を逆にする方法を示します。

2. 従来のforループ

文字列は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は、文字の可変シーケンスを作成する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

Apache Commons は、文字列操作を含む多くのユーティリティクラスを備えた人気のあるJavaライブラリです。

いつものように、Apache Commonsの使用を開始するには、最初にMaven依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

StringUtils クラスは、 StringBuilderと同様のreverse()メソッドを提供するため、ここで必要なものです。

このライブラリを使用する利点の1つは、そのユーティリティメソッドがnullセーフ操作を実行することです。 したがって、エッジケースを個別に処理する必要はありません。

目的を達成し、StringUtilsクラスを使用するメソッドを作成しましょう。

public String reverseUsingApacheCommons(String input) {
    return StringUtils.reverse(input);
}

さて、これら3つの方法を見ると、3番目の方法は最も単純でエラーが発生しにくい方法であり、文字列を逆にすることができます。

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

ここで、単語がスペースで区切られ、句読点がない文があると仮定します。 この文の語順を逆にする必要があります。

この問題は、をスペース区切り文字で分割し、単語を逆の順序で連結するという2つのステップで解決できます。

まず、古典的なアプローチを示します。 問題の最初の部分を実行するために、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();
}

次に、ApacheCommonsライブラリの使用を検討します。 繰り返しになりますが、より読みやすく、エラーが発生しにくいコードを実現するのに役立ちます。入力文と区切り文字を引数として StringUtils.reverseDelimited()メソッドを呼び出すだけで済みます。 :

public String reverseTheOrderOfWordsUsingApacheCommons(String sentence) {
    return StringUtils.reverseDelimited(sentence, ' ');
}

6. 結論

このチュートリアルでは、最初にJavaのStringを反転するさまざまな方法を確認しました。 コアJavaを使用した例と、ApacheCommonsなどの人気のあるサードパーティライブラリを使用した例をいくつか紹介しました。

次に、2つのステップで文の語順を逆にする方法を見てきました。 これらの手順は、文の他の順列を実現するのにも役立ちます。

いつものように、このチュートリアルに示されているすべてのコードサンプルは、GitHubからで入手できます。