Java | 配列の一部だけを取り出して新しい配列を作る

Java Java
スポンサーリンク

Javaの配列を「一部だけ取り出す」方法

初心者向けに、配列の一部分だけを取り出す便利なメソッド Arrays.copyOfRange を、例題つきで丁寧に解説します。配列の「切り出し」を覚えると、必要なデータだけ扱えるようになってコードがすっきりします。


基本の考え方

  • 配列はサイズ固定: いったん作った配列の大きさは変えられません。必要な部分だけを使いたい時は「新しい配列」を作ります。
  • 部分だけ欲しい: そのために使えるのが Arrays.copyOfRange(元配列, 開始位置, 終了位置) です。
  • 開始は含む・終了は含まない: 開始位置の要素は入るけど、終了位置の要素は入らない(直前まで)。

使い方のルール

  • 書き方:
int[] 取り出し後 = Arrays.copyOfRange(元配列, from, to);
Java
  • 含まれる範囲: from 以上、to 未満のインデックスがコピーされる
  • インデックスの数え方: 0から始まる(先頭が0、次が1…)
  • エラーになるケース:
    • 範囲外: from < 0to < 0from > 元配列.lengthto > 元配列.length はエラー
    • 逆順: from > to はエラー
    • null: 元配列が null はエラー

いちばんシンプルな例

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    int[] src = {12, 24, 18, 35, 21};
    int[] part = Arrays.copyOfRange(src, 1, 4);

    System.out.println(Arrays.toString(part)); // [24, 18, 35]
  }
}
Java
  • ポイント: 1 から 4 未満 → 1, 2, 3番目が入るので [24, 18, 35]

例題1:前半だけ取り出す

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    String[] names = {"佐藤", "鈴木", "高橋", "田中", "伊藤"};
    String[] firstThree = Arrays.copyOfRange(names, 0, 3);

    System.out.println(Arrays.toString(firstThree)); // [佐藤, 鈴木, 高橋]
  }
}
Java
  • 目的: 先頭から3人だけ欲しい
  • コツ: 先頭は 0、3人分なら to3

例題2:後半だけ取り出す

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    int[] scores = {55, 68, 72, 81, 90, 64};
    int[] lastTwo = Arrays.copyOfRange(scores, scores.length - 2, scores.length);

    System.out.println(Arrays.toString(lastTwo)); // [90, 64]
  }
}
Java
  • 目的: 最後の2件だけ欲しい
  • コツ: 最後は length、最後の2件の開始は length - 2

例題3:真ん中の区間を取り出す

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    int[] arr = {10, 20, 30, 40, 50, 60};
    int[] middle = Arrays.copyOfRange(arr, 2, 5);

    System.out.println(Arrays.toString(middle)); // [30, 40, 50]
  }
}
Java
  • 目的: インデックス2〜4の3つを欲しい
  • コツ: to は含まれないので、5にする

例題4:空の結果になるパターン(範囲が0件)

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    int[] nums = {1, 2, 3};
    int[] empty = Arrays.copyOfRange(nums, 2, 2);

    System.out.println(Arrays.toString(empty)); // []
    System.out.println(empty.length);           // 0
  }
}
Java
  • 目的: 範囲の長さが0(from == to)だと空配列が返る
  • 注意: エラーではなく「要素なし」

例題5:エラーになるケースを体験する

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    int[] nums = {1, 2, 3, 4};

    // 実行時に例外(ArrayIndexOutOfBoundsException)が発生
    int[] bad = Arrays.copyOfRange(nums, -1, 2);
  }
}
Java
  • 理由: from が負の数は範囲外なのでエラー
  • 他にも: to > lengthfrom > to もエラー

よくあるつまずきと対策

  • 終了位置を入れてしまう: to は「含まない」。入れたい最後の位置より1つ大きい数にする。
  • 範囲外でエラー: 0 <= from <= to <= 元配列.length の形になっているか見直す。
  • サイズの勘違い: 取り出される要素数は to - from。この差が配列の長さになる。

応用ヒント

  • 複製(全部コピー)したい: Arrays.copyOf(元配列, 元配列.length) の方が分かりやすい。
  • 型に注意: int[] なら int[] が返る。String[] なら String[]。型は元配列に合わせる。
  • 配列を文字列で表示: デバッグ時は Arrays.toString(配列) が便利。

練習課題

  • 課題1: double[] prices = {120.5, 980.0, 450.0, 799.9, 1500.0}; の真ん中3つを取り出して表示しよう。
  • 課題2: 名前の配列から、2番目から最後までを取り出すコードを書いてみよう。
  • 課題3: エラーにならないように、ユーザーが指定した fromto をチェックしてから copyOfRange を呼ぶ関数を作ってみよう。

解答・解説


課題1

問題:

double[] prices = {120.5, 980.0, 450.0, 799.9, 1500.0};
Java

この配列の真ん中3つを取り出して表示する。

解答例:

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    double[] prices = {120.5, 980.0, 450.0, 799.9, 1500.0};
    double[] middle = Arrays.copyOfRange(prices, 1, 4);

    System.out.println(Arrays.toString(middle)); // [980.0, 450.0, 799.9]
  }
}
Java

解説:

  • インデックスは 0 から始まるので、真ん中3つは 1, 2, 3 番目。
  • copyOfRange(prices, 1, 4) とすると、1以上4未満 → 1,2,3番目がコピーされる。

課題2

問題:
名前の配列から、2番目から最後までを取り出す。

解答例:

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    String[] names = {"佐藤", "鈴木", "高橋", "田中", "伊藤"};
    String[] sub = Arrays.copyOfRange(names, 1, names.length);

    System.out.println(Arrays.toString(sub)); // [鈴木, 高橋, 田中, 伊藤]
  }
}
Java

解説:

  • 2番目はインデックス 1
  • 最後まで取りたいときは tonames.length を指定する。
  • length は「要素数」なので、最後のインデックスより1大きい数になる。これが「終了位置は含まない」ルールとぴったり合う。

課題3

問題:
ユーザーが指定した fromto をチェックしてから copyOfRange を呼ぶ関数を作る。

解答例:

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    int[] nums = {10, 20, 30, 40, 50};

    int[] safeCopy = safeCopyOfRange(nums, 1, 4);
    System.out.println(Arrays.toString(safeCopy)); // [20, 30, 40]

    int[] badCopy = safeCopyOfRange(nums, -1, 3);
    System.out.println(Arrays.toString(badCopy)); // []
  }

  public static int[] safeCopyOfRange(int[] arr, int from, int to) {
    if (arr == null) return new int[0];
    if (from < 0 || to > arr.length || from > to) {
      // 不正な範囲なら空配列を返す
      return new int[0];
    }
    return Arrays.copyOfRange(arr, from, to);
  }
}
Java

解説:

  • fromto が正しい範囲かどうかをチェックする。
  • 不正なら例外を出す代わりに「空配列」を返すようにした。
  • 実際のアプリでは「エラーメッセージを出す」など別の対応もあり得る。

まとめ

  • 課題1: 真ん中の要素を取り出す → インデックスを正しく指定
  • 課題2: 最後まで取り出す → to配列.length を使う
  • 課題3: 安全に使う → 範囲チェックを入れる

これで「配列の部分コピー」を安心して使えるようになります。


まとめ

  • 配列の部分取り出しは Arrays.copyOfRange が基本。
  • 開始は含み、終了は含まない。 取り出したい最後の位置の「1つ後」を to にする。
  • 範囲チェックでエラー回避。 0 <= from <= to <= length を守る。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました