ここでは 「配列を反転する再帰版」 と 「Java 8 の Stream を使った反転」 を、初心者向けに分かりやすく説明します。
コードもすぐコピペして使える形で載せます。
1. 再帰を使って配列を反転する方法
まず考え方(超シンプル)
- 「先頭」と「末尾」を交換する
- 残りの部分(内側)も同じように交換する → これを 自分自身(メソッド)」に任せる
- 交換範囲がクロスしたら終了
つまり…
reverse(a, left, right)
left >= right → 終了
swap(a[left], a[right])
reverse(a, left+1, right-1) を呼ぶ
再帰版のコード(完全版)
public class ReverseRecursive {
public static void main(String[] args) {
int[] arr = {12, 24, 18, 31, 17};
reverse(arr, 0, arr.length - 1);
System.out.println(java.util.Arrays.toString(arr));
}
public static void reverse(int[] arr, int left, int right) {
if (left >= right) {
return; // 終了条件(ベースケース)
}
// swap
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
// 内側の区間を反転
reverse(arr, left + 1, right - 1);
}
}
Java再帰が苦手な人のポイント
- 再帰関数は 「1回の仕事(swap)」→「残りは再帰に任せる」 で考えると理解しやすい
- 「左端と右端を交換する」だけを自分でやれば OK
- 残りの部分については深く考えない方が分かりやすい
2. Java 8 Stream API で反転する方法
Stream を使うと コードがすごく短くなる けれど、配列を直接反転するわけではない点に注意。
典型パターン(int[] → boxed → reverse → int[])
Java の primitive 配列(int[])は直接 Stream に渡せないので、一度 IntStream にしてから boxed() で Integer に変換して使います。
Stream を使った反転の完全版コード
import java.util.*;
import java.util.stream.*;
public class ReverseStream {
public static void main(String[] args) {
int[] arr = {12, 24, 18, 31, 17};
int[] reversed = IntStream.of(arr)
.boxed() // Integer に変換
.sorted(Comparator.reverseOrder()) // ❌ これだと値の大小で反転してしまう(順序が壊れる)
.mapToInt(i -> i)
.toArray();
}
}
Java❌ 上記は間違い(逆順ソートになる)
Stream で「逆順」を自然に書くと 値の大小で反転してしまう。
元の並びは維持されない。
正しい Stream 反転(自然なやり方)
List に変換 → Collections.reverse → 配列に戻す
Stream では **「index を扱いにくい」**ので、最もシンプルなのは List を介す方法。
int[] arr = {12, 24, 18, 31, 17};
List<Integer> list = IntStream.of(arr)
.boxed()
.collect(Collectors.toList());
Collections.reverse(list);
int[] reversed = list.stream()
.mapToInt(i -> i)
.toArray();
JavaStream だけで完結したテクニック(上級者向け)
どうしても “Stream だけ” でやりたいなら、「インデックス Stream を作る」方法がある。
int[] arr = {12, 24, 18, 31, 17};
int[] reversed = IntStream.range(0, arr.length)
.map(i -> arr[arr.length - 1 - i]) // 末尾から取り出す
.toArray();
Javaポイント
0 → length-1の範囲でループし、arr[length - 1 - i]の値を順に取り出すだけ- 実は for 文より読みやすい
再帰版 vs Stream 版の比較(初心者向け)
| 方法 | 向いているケース | 特徴 |
|---|---|---|
| for 文(基本) | 一番ベーシックな方法 | 最速で一番読みやすい |
| 再帰版 | 再帰を学ぶ目的、アルゴリズム学習 | シンプルで美しいが、長い配列だとスタックが深くなる |
| Stream(List 経由) | モダンな書き方、読みやすい | コードが短い/配列→List→配列になる |
| Stream(インデックス参照) | Stream を“使いこなす”用途 | for 文と同等の動作を Stream で表現可能 |
