Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで文字列を逆順にする方法まとめ|最も簡単な方法から再帰・Java 8まで

文字列の反転(リバース)は、Javaの技術面接で最も頻出する質問の一つです。面接官は「複数の異なる方法で文字列を反転するコードを書いてください」「組み込みメソッドを使わずに反転してください」「再帰を使って実装してください」など、さまざまなバリエーションで質問してくることがあります。

この記事では、Javaで文字列を逆順にするための代表的な方法を、実際に動作するサンプルコードとともに紹介します。

Javaで文字列を反転する最も簡単な方法

Javaで文字列を反転する最も簡単な方法は、StringBuilderクラスが提供する組み込みのreverse()メソッドを使うことです。わずか1行で実装でき、実務でもまず最初に検討すべきアプローチです。

サンプルコード:

package io.devqa.tutorials;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ReverseString {

    String reverse(String inputString) {
        return new StringBuilder(inputString).reverse().toString();
    }

    @Test
    public void testAWord() {
        assertEquals("tobor", new ReverseString().reverse("robot"));
    }
}
  • JavaでtoString()をオーバーライドすべき理由
  • Javaで文字列を比較する方法
  • 文字列から数値を抽出する方法
  • JavaでStringをintに変換する方法

charAt()とループを使って文字列を反転する

組み込みのreverse()メソッドを使いたくない場合は、StringクラスのcharAt()メソッドを利用して、文字列の末尾から先頭に向かって1文字ずつ取り出し、新しい文字列に連結していく方法があります。

サンプルコード:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ReverseString {

    String reverse(String inputString) {

        StringBuilder reverseStringBuilder = new StringBuilder();

        for(int i = inputString.length() - 1; i>=0; i--){
            reverseStringBuilder.append(inputString.charAt(i));
        }

        return reverseStringBuilder.toString();
    }

    @Test
    public void testAWord() {
        assertEquals("tobor", new ReverseString().reverse("robot"));
    }
}

上記のコードのバリエーションとして、toCharArray()で文字配列に変換し、拡張forループで各文字を先頭に追加していく書き方もあります。

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ReverseString {

    String reverse(String inputString) {
        String outString = "";
        for(char c : inputString.toCharArray()) {
            outString = c + outString;
        }
        return outString;
    }

    @Test
    public void testAWord() {
        assertEquals("tobor", new ReverseString().reverse("robot"));
    }
}

おまけ:再帰を使った実装

面接で「再帰を使って」と求められた場合の参考として、再帰による実装例も紹介します。文字列の先頭1文字を除いた部分を再帰的に反転し、その結果の末尾に先頭の文字を連結するという考え方です。

String reverse(String inputString) {
    if (inputString.isEmpty()) {
        return inputString;
    }
    return reverse(inputString.substring(1)) + inputString.charAt(0);
}

なお、この実装は文字列が長いとStackOverflowErrorが発生する可能性があるため、あくまで面接や学習用のテクニックと捉えるのがよいでしょう。

Java 8のStream APIを使って文字列を反転する

Java 8以降では、Stream API(IntStream)を活用して関数型スタイルで文字列を反転することもできます。インデックスを逆順にたどりながら各文字を連結していく実装です。

import org.junit.jupiter.api.Test;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ReverseString {

    String reverse(String inputString) {
        return IntStream.range(0, inputString.length())
            .mapToObj(x-> inputString.charAt((inputString.length()-1) - x))
            .map(character -> String.valueOf(character))
            .collect(Collectors.joining(""));
    }

    @Test
    public void testAWord() {
        assertEquals("tobor", new ReverseString().reverse("robot"));
    }
}

このように、Javaで文字列を反転する方法は複数あります。実務ではStringBuilder.reverse()がシンプルかつ高速でおすすめですが、面接対策としては、ループ・再帰・Stream APIそれぞれの実装方法と計算量の違いを理解しておくことが重要です。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. Pythonで文字列を逆順に反転する方法|追加メモリ不要のインプレース手法

    文字の配列が与えられたとき、追加のメモリ領域を使用せずに文字列を逆順に反転することを考えます。たとえば、入力が [H, E, L, L, O] である場合、期待される出力は [O, L, L, E, H] となります。 解法のアプローチ この問題は「Two Pointers(ツーポインタ)」と呼ばれる定番のテクニックで効率的に解けます。考え方はシンプルで、配列の両端から中央に向かって文字を交換していくだけです。 手順 2つのポインタを用意します:start = 0、end = 文字列の長さ - 1 s[start] と s[end] の文字を入れ替えます start を1つ増やし、end を