Java | 配列を逆順に並べ替える方法

Java Java
スポンサーリンク

ここでは 「配列を反転する再帰版」「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();
Java

Stream だけで完結したテクニック(上級者向け)

どうしても “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 で表現可能
タイトルとURLをコピーしました