Javaの配列を「一部だけ取り出す」方法
初心者向けに、配列の一部分だけを取り出す便利なメソッド Arrays.copyOfRange を、例題つきで丁寧に解説します。配列の「切り出し」を覚えると、必要なデータだけ扱えるようになってコードがすっきりします。
基本の考え方
- 配列はサイズ固定: いったん作った配列の大きさは変えられません。必要な部分だけを使いたい時は「新しい配列」を作ります。
- 部分だけ欲しい: そのために使えるのが
Arrays.copyOfRange(元配列, 開始位置, 終了位置)です。 - 開始は含む・終了は含まない: 開始位置の要素は入るけど、終了位置の要素は入らない(直前まで)。
使い方のルール
- 書き方:
int[] 取り出し後 = Arrays.copyOfRange(元配列, from, to);
Java- 含まれる範囲:
from以上、to未満のインデックスがコピーされる - インデックスの数え方: 0から始まる(先頭が0、次が1…)
- エラーになるケース:
- 範囲外:
from < 0、to < 0、from > 元配列.length、to > 元配列.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人分ならtoは3
例題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 > lengthやfrom > 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: エラーにならないように、ユーザーが指定した
fromとtoをチェックしてから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。 - 最後まで取りたいときは
toにnames.lengthを指定する。 lengthは「要素数」なので、最後のインデックスより1大きい数になる。これが「終了位置は含まない」ルールとぴったり合う。
課題3
問題:
ユーザーが指定した from と to をチェックしてから 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解説:
fromとtoが正しい範囲かどうかをチェックする。- 不正なら例外を出す代わりに「空配列」を返すようにした。
- 実際のアプリでは「エラーメッセージを出す」など別の対応もあり得る。
まとめ
- 課題1: 真ん中の要素を取り出す → インデックスを正しく指定
- 課題2: 最後まで取り出す →
toに配列.lengthを使う - 課題3: 安全に使う → 範囲チェックを入れる
これで「配列の部分コピー」を安心して使えるようになります。
まとめ
- 配列の部分取り出しは
Arrays.copyOfRangeが基本。 - 開始は含み、終了は含まない。 取り出したい最後の位置の「1つ後」を
toにする。 - 範囲チェックでエラー回避。
0 <= from <= to <= lengthを守る。
