1. 導入
Java の配列は強力ですが、基本的な文法だけでは日常作業で手間がかかりがちです。そこで役立つのが java.util.Arrays — 配列操作のための静的メソッド群(ソート、コピー、比較、整形出力など)です。インスタンスを作成する必要はありません。すべてのメソッドは static で、クラス名から呼び出します。
これらのメソッドを使うには、ファイル冒頭でインポートします:
import java.util.Arrays;
インポートを忘れると、コンパイラは Arrays が「見つかりません」と警告します。これはバグではなく、インポートしていない場合の当然の挙動です。
2. 配列のソート: Arrays.sort
Arrays.sort の動作
構文
Arrays.sort(massiv);
Arrays.sort(massiv, nachal’nyyIndeks, konechnyyIndeks);
メソッドは「インプレース」でソートし、元の配列を変更します。新しい配列は返しません。元の順序を残したい場合は、まず配列をコピーしてからソートしましょう。
例: 整数配列のソート
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // 昇順でソート
System.out.println("ソート済みの配列: " + Arrays.toString(scores));
// 出力: [1, 2, 5, 7, 9]
例: 文字列配列のソート
String[] names = {"Vasya", "Petya", "Anya", "Igor’"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Anya, Igor’, Petya, Vasya]
注意: 文字列は辞書(アルファベット)順、数値は昇順でソートされます。
配列の一部をソート
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // インデックス 1 から 3 まで(4 は含まない)をソートします
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
特徴
- インプレースソート: 元の配列が書き換わる。
- 数値は昇順、文字列は辞書順。
- 複合オブジェクトには Comparator を受け取るオーバーロードを使用。
3. 配列の埋め詰め: Arrays.fill
構文
Arrays.fill(massiv, znachenie);
Arrays.fill(massiv, nachal’nyyIndeks, konechnyyIndeks, znachenie);
配列全体または指定範囲を同じ値で埋めます。
int[] marks = new int[5];
Arrays.fill(marks, 3); // すべての要素が 3 になる
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
配列の一部を埋める
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // インデックス 2 から 4(5 は含まない)を 7 で埋める
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
文字列配列を埋める
String[] guests = new String[4];
Arrays.fill(guests, "空");
System.out.println(Arrays.toString(guests)); // [空, 空, 空, 空]
4. 配列のコピー: Arrays.copyOf と Arrays.copyOfRange
Arrays.copyOf
構文
Arrays.copyOf(iskhodnyyMassiv, novayaDlina);
新しい配列を作成し、元の配列から要素をコピーします。新しい長さが元より長い場合、末尾はデフォルト値で埋められます(0 は int、参照型は null)。
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
配列を短くする
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
構文
Arrays.copyOfRange(iskhodnyyMassiv, nachal’nyyIndeks, konechnyyIndeks);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // インデックス 1 から 3 の要素をコピー
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. 配列の比較: Arrays.equals と Arrays.deepEquals
Java では配列を == で比較してはいけません。これは参照の比較であり、中身の比較ではありません:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
中身を比較するには?
Arrays.equals(massiv1, massiv2);
Arrays.deepEquals(matritsa1, matritsa2);
System.out.println(Arrays.equals(a, b)); // true
一次元配列には Arrays.equals を、多次元配列(配列の配列)には Arrays.deepEquals を使います。
例: 二次元配列の比較
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. 配列の見やすい出力: Arrays.toString と Arrays.deepToString
配列をそのまま出力すると、読みづらい文字列になります:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
構文
Arrays.toString(massiv);
Arrays.deepToString(matritsa);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. Arrays クラス使用時のよくあるミス
エラー №1: 配列を == で比較してしまう
配列はオブジェクトであり、== は参照のみを比較します。たとえ値が同じでも結果は false です。一次元配列には Arrays.equals、多次元配列には Arrays.deepEquals を使いましょう。
エラー №2: ソートが配列を書き換えることを忘れる
元の順序が必要な場合は、まず Arrays.copyOf でコピーを作成し、そのコピーをソートしてください。さもないとオリジナルの順序は失われます。
エラー №3: Arrays.fill と Arrays.copyOfRange の範囲の解釈を誤る
これらのメソッドは半開区間(右端は含まない)を使います。たとえば、Arrays.fill(arr, 2, 5, 9) はインデックス 2, 3, 4 を埋め、インデックス 5 の要素は変更しません。
エラー №4: 配列をそのまま出力しようとする
System.out.println(arr) は内部的な表現を出力します。一次元配列には Arrays.toString、多次元配列には Arrays.deepToString を使用してください。
エラー №5: 多次元配列を Arrays.equals で比較してしまう
このメソッドは最上位レベル(内部配列への参照)だけを比較します。内容を比較するには Arrays.deepEquals を使いましょう。
GO TO FULL VERSION